#Part 1 The purpose of this notebook is to determine the selective benefit of glucosinolate and flavonoid compounds through plant competition by creating selection gradients. Selection gradients will involve final body mass as the proxy for fitness, but this will be replaced with fitness once the measurement is in. Concentration will be on the x-axis. This analysis will account for family and greenhouse location.

#Part 2 The second purpose is to determine if glucosinolates and flavonoids influence suscpetibility to pathogens and if this susceptibility results in increased fitness

#Read in and prep data

library(ggplot2)
Registered S3 method overwritten by 'dplyr':
  method           from
  print.rowwise_df     
library(lme4)
Loading required package: Matrix
library(tidyr)

Attaching package: ‘tidyr’

The following objects are masked from ‘package:Matrix’:

    expand, pack, unpack
library(cowplot)

********************************************************
Note: As of version 1.0.0, cowplot does not change the
  default ggplot2 theme anymore. To recover the previous
  behavior, execute:
  theme_set(theme_cowplot())
********************************************************
library(grid)
library(gridExtra)
library(dplyr)

Attaching package: ‘dplyr’

The following object is masked from ‘package:gridExtra’:

    combine

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union
source("GGPlot_Themes.R")

#read in data
rm(list=ls())
dat<-read.csv("DataSynthesis.csv")

#Remove maple controls data from the data set.
dat<-dat %>% filter(treatment!="mcnt") %>% droplevels()

#Assign family column
prefamily<-gsub("*.\\|","",dat$Tag)
dat$Family<-gsub("\\-.*","",prefamily)

#remove those with fertilizer treatment, and extra genotypes that are only in the alone treatment. 
dat<-dat[!grepl("i",dat$Sample,fixed=T),]

#Initializing columns to avoid constant error messages. 
dat$WhiteFungLogis<-NA
dat$BlackFungLogis<-NA

#Generating data frames with summarized leaf data (dat2) and summarized genotype data (dat3)

#Summarizing: Taking the mean value of leaves. This tibble contains data at the level of the plant means. 
dat2<-dat %>% group_by(Tag) %>% summarize(ChlorA=mean(ChlorA),ChlorB=mean(ChlorB),gluc_Conc=mean(gluc_Conc),flav_Conc=mean(flav_Conc),Family=first(Family),treatment=first(treatment),gh_row=first(gh_row),gh_bench=first(gh_bench),GM_TotalLeaf_Area=first(GM_TotalLeaf_Area),comp_number=first(comp_number),ThripsDam=mean(ThripsDam),WhiteFungDam=mean(WhiteFungDam),BlackPathDam=mean(BlackPathDam),Fern=mean(Fern),gh_col=first(gh_col))


#All of these genotypes died (15 Genotypes).(We are simply missing a final measurement for e|JBCHY1-1-50|Q|240) That is only 3% Mortality. 
dead<-dat2[is.na(dat2$GM_TotalLeaf_Area),]

#Removing those with dead competitors from the garlic mustard treatment. ("e|JBCHY1-1-50|Q|240") did not die, we are simply missing the final measurement for it.

dead_competitors<-dead %>% filter(treatment=="gm",Tag!="e|JBCHY1-1-50|Q|240") %>% select(comp_number)

#Removing those with dead competitors from the analysis. 
dat2<-dat2 %>% filter(!comp_number %in% dead_competitors$comp_number)


##Summarizing: Taking the mean value of plants. This tibble contains data at the level of the family means within each treatment. 
dat3<-dat2 %>% drop_na(GM_TotalLeaf_Area) %>% group_by(Family,treatment)  %>% summarize_if(is.numeric,mean)

#Searching for a fitness trade-off between the alone and interspecific competition treatment.

source("GGPlot_Themes.R")

#Calculating family means within treatment. 
TradeOff<-dat3 %>% filter(treatment=="a") %>% drop_na(GM_TotalLeaf_Area) %>%  select(LeafSizeAlone=GM_TotalLeaf_Area,Family,gluc_ConcAlone=gluc_Conc) %>% right_join(dat3 %>% filter(treatment=="m") %>%  select(LeafSizeMaple=GM_TotalLeaf_Area,Family,gluc_ConcMaple=gluc_Conc),by="Family")

#Calculating standard error of each family
StdErr<-dat2 %>% select(Family,treatment,GM_TotalLeaf_Area) %>% group_by(Family,treatment) %>% drop_na(GM_TotalLeaf_Area) %>%  summarize(StdErr=sd(GM_TotalLeaf_Area)/sqrt(length(GM_TotalLeaf_Area)),size=length(GM_TotalLeaf_Area))

#Shifting the data to be in long form. 
StdErr2<-StdErr %>% filter(treatment=="a") %>% select(StdErrAlone=StdErr,Family) %>% right_join(StdErr %>% filter(treatment=="m") %>% select(StdErrMaple=StdErr,Family),by="Family")

TradeOff2<-StdErr2 %>% left_join(TradeOff)
Joining, by = "Family"
#tiff("Selection_Figures/TradeOff.tiff", units="in", width=10, height=6, res=300)

ggplot(TradeOff2,aes(y=LeafSizeAlone,x=LeafSizeMaple))+
  geom_point()+
  geom_linerange(aes(ymin = LeafSizeAlone - StdErrAlone, 
                    ymax = LeafSizeAlone + StdErrAlone))+
  geom_errorbarh(aes(xmin = LeafSizeMaple - StdErrMaple,
                    xmax = LeafSizeMaple + StdErrMaple))+
theme_simple()+
  xlab("Performance with Maple")+
  ylab("Performance Alone")

#dev.off()
summary(lm(LeafSizeAlone~LeafSizeMaple,data=TradeOff2))

Call:
lm(formula = LeafSizeAlone ~ LeafSizeMaple, data = TradeOff2)

Residuals:
    Min      1Q  Median      3Q     Max 
-2019.5  -657.0  -265.5   907.7  2364.0 

Coefficients:
                Estimate Std. Error t value Pr(>|t|)    
(Intercept)   9590.03571 1616.26626   5.933 6.87e-06 ***
LeafSizeMaple   -0.00936    0.18258  -0.051     0.96    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1244 on 21 degrees of freedom
Multiple R-squared:  0.0001251, Adjusted R-squared:  -0.04749 
F-statistic: 0.002628 on 1 and 21 DF,  p-value: 0.9596

#Visualizing genetic variation and greenhouse variation, which will be controlled for.

#GH Bench
ggplot(dat2)+
  geom_point(aes(y=gluc_Conc,x=gh_bench,colour=as.factor(gh_bench)))


#GH Col
ggplot(dat2)+
  geom_point(aes(y=gluc_Conc,x=gh_col,colour=as.factor(gh_bench)))


#Investigating genetic differences by treatment
#gluc_Conc
boxplot(gluc_Conc~Family,data=dat2[dat2$treatment=="a",])

boxplot(gluc_Conc~Family,data=dat2[dat2$treatment=="m",])

boxplot(gluc_Conc~Family,data=dat2[dat2$treatment=="gm",])

#bodymass
boxplot(GM_TotalLeaf_Area~Family,data=dat2[dat2$treatment=="a",])

boxplot(GM_TotalLeaf_Area~Family,data=dat2[dat2$treatment=="m",])

boxplot(GM_TotalLeaf_Area~Family,data=dat2[dat2$treatment=="gm",])

#Modelling: What influences performance (total leaf area)

#This is the full model.I expect that the influence of gluc conc and flav conc could vary between treatments because of allelopathy, therefore, i include interactions with these variables. However, i have no reason to think that pathogens or fern abundance could influence fitness differently in different treatments, therefore, no interactions are included.

#First lets ensure we are using the correct random effects.
fitfull0<-lmer(GM_TotalLeaf_Area~treatment*gluc_Conc*flav_Conc+BlackPathDam+WhiteFungDam+ThripsDam+Fern+(1|Family), data=dat2)

fitfull<-lmer(GM_TotalLeaf_Area~treatment*gluc_Conc*flav_Conc+BlackPathDam+WhiteFungDam+ThripsDam+Fern+(1|Family)+(1|gh_bench), data=dat2)

fitfull2<-lmer(GM_TotalLeaf_Area~treatment*gluc_Conc*flav_Conc+BlackPathDam+WhiteFungDam+ThripsDam+Fern+(1|Family)+(1|gh_bench/gh_row), data=dat2)

fitfull3<-lmer(GM_TotalLeaf_Area~treatment*gluc_Conc*flav_Conc+BlackPathDam+WhiteFungDam+ThripsDam+Fern+(1|Family)+(1|gh_bench/gh_col), data=dat2)

anova(fitfull0,fitfull) #Strong evidence to use bench.
refitting model(s) with ML (instead of REML)
Data: dat2
Models:
fitfull0: GM_TotalLeaf_Area ~ treatment * gluc_Conc * flav_Conc + BlackPathDam + 
fitfull0:     WhiteFungDam + ThripsDam + Fern + (1 | Family)
fitfull: GM_TotalLeaf_Area ~ treatment * gluc_Conc * flav_Conc + BlackPathDam + 
fitfull:     WhiteFungDam + ThripsDam + Fern + (1 | Family) + (1 | gh_bench)
         npar    AIC    BIC  logLik deviance Chisq Df Pr(>Chisq)    
fitfull0   18 6603.2 6672.7 -3283.6   6567.2                        
fitfull    19 6576.9 6650.2 -3269.4   6538.9 28.37  1  1.002e-07 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
anova(fitfull,fitfull2) #Using bench/row is the same as the null model.
refitting model(s) with ML (instead of REML)
Data: dat2
Models:
fitfull: GM_TotalLeaf_Area ~ treatment * gluc_Conc * flav_Conc + BlackPathDam + 
fitfull:     WhiteFungDam + ThripsDam + Fern + (1 | Family) + (1 | gh_bench)
fitfull2: GM_TotalLeaf_Area ~ treatment * gluc_Conc * flav_Conc + BlackPathDam + 
fitfull2:     WhiteFungDam + ThripsDam + Fern + (1 | Family) + (1 | gh_bench/gh_row)
         npar    AIC    BIC  logLik deviance  Chisq Df Pr(>Chisq)
fitfull    19 6576.9 6650.2 -3269.4   6538.9                     
fitfull2   20 6577.7 6654.8 -3268.8   6537.7 1.2001  1     0.2733
anova(fitfull,fitfull3) #There is evidence to use bench/collumn however. 
refitting model(s) with ML (instead of REML)
Data: dat2
Models:
fitfull: GM_TotalLeaf_Area ~ treatment * gluc_Conc * flav_Conc + BlackPathDam + 
fitfull:     WhiteFungDam + ThripsDam + Fern + (1 | Family) + (1 | gh_bench)
fitfull3: GM_TotalLeaf_Area ~ treatment * gluc_Conc * flav_Conc + BlackPathDam + 
fitfull3:     WhiteFungDam + ThripsDam + Fern + (1 | Family) + (1 | gh_bench/gh_col)
         npar    AIC    BIC  logLik deviance Chisq Df Pr(>Chisq)  
fitfull    19 6576.9 6650.2 -3269.4   6538.9                      
fitfull3   20 6573.7 6650.9 -3266.9   6533.7 5.145  1    0.02331 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#Modelling fixed effects. -----------

#Full Model
fitfull3<-lmer(GM_TotalLeaf_Area~treatment*gluc_Conc*flav_Conc+BlackPathDam+WhiteFungDam+ThripsDam+Fern+(1|Family)+(1|gh_bench/gh_col), data=dat2)

#Removing three way interaction
fit.1<-update(fitfull3, ~.-treatment:gluc_Conc:flav_Conc)
anova(fitfull3,fit.1) #Good to remove
refitting model(s) with ML (instead of REML)
Data: dat2
Models:
fit.1: GM_TotalLeaf_Area ~ treatment + gluc_Conc + flav_Conc + BlackPathDam + 
fit.1:     WhiteFungDam + ThripsDam + Fern + (1 | Family) + (1 | gh_bench/gh_col) + 
fit.1:     treatment:gluc_Conc + treatment:flav_Conc + gluc_Conc:flav_Conc
fitfull3: GM_TotalLeaf_Area ~ treatment * gluc_Conc * flav_Conc + BlackPathDam + 
fitfull3:     WhiteFungDam + ThripsDam + Fern + (1 | Family) + (1 | gh_bench/gh_col)
         npar    AIC    BIC  logLik deviance  Chisq Df Pr(>Chisq)
fit.1      18 6573.6 6643.0 -3268.8   6537.6                     
fitfull3   20 6573.7 6650.9 -3266.9   6533.7 3.8462  2     0.1462
#Removing two way interaction gluc:flav
fit.2<-update(fit.1,~.-gluc_Conc:flav_Conc)
anova(fit.2,fit.1) #Good to remove. 
refitting model(s) with ML (instead of REML)
Data: dat2
Models:
fit.2: GM_TotalLeaf_Area ~ treatment + gluc_Conc + flav_Conc + BlackPathDam + 
fit.2:     WhiteFungDam + ThripsDam + Fern + (1 | Family) + (1 | gh_bench/gh_col) + 
fit.2:     treatment:gluc_Conc + treatment:flav_Conc
fit.1: GM_TotalLeaf_Area ~ treatment + gluc_Conc + flav_Conc + BlackPathDam + 
fit.1:     WhiteFungDam + ThripsDam + Fern + (1 | Family) + (1 | gh_bench/gh_col) + 
fit.1:     treatment:gluc_Conc + treatment:flav_Conc + gluc_Conc:flav_Conc
      npar    AIC    BIC  logLik deviance  Chisq Df Pr(>Chisq)
fit.2   17 6573.6 6639.2 -3269.8   6539.6                     
fit.1   18 6573.6 6643.0 -3268.8   6537.6 2.0633  1     0.1509
#Removing treatment:flavonoid interactions
fit.3<-update(fit.2,~.-treatment:flav_Conc)
anova(fit.2,fit.3) #Good to remove. 
refitting model(s) with ML (instead of REML)
Data: dat2
Models:
fit.3: GM_TotalLeaf_Area ~ treatment + gluc_Conc + flav_Conc + BlackPathDam + 
fit.3:     WhiteFungDam + ThripsDam + Fern + (1 | Family) + (1 | gh_bench/gh_col) + 
fit.3:     treatment:gluc_Conc
fit.2: GM_TotalLeaf_Area ~ treatment + gluc_Conc + flav_Conc + BlackPathDam + 
fit.2:     WhiteFungDam + ThripsDam + Fern + (1 | Family) + (1 | gh_bench/gh_col) + 
fit.2:     treatment:gluc_Conc + treatment:flav_Conc
      npar    AIC    BIC  logLik deviance  Chisq Df Pr(>Chisq)
fit.3   15 6570.3 6628.2 -3270.1   6540.3                     
fit.2   17 6573.6 6639.2 -3269.8   6539.6 0.6791  2     0.7121
fit.4<-update(fit.3,~.-treatment:gluc_Conc)
anova(fit.4,fit.3)  #That significantly affected the predictive power. Did Not Remove 
refitting model(s) with ML (instead of REML)
Data: dat2
Models:
fit.4: GM_TotalLeaf_Area ~ treatment + gluc_Conc + flav_Conc + BlackPathDam + 
fit.4:     WhiteFungDam + ThripsDam + Fern + (1 | Family) + (1 | gh_bench/gh_col)
fit.3: GM_TotalLeaf_Area ~ treatment + gluc_Conc + flav_Conc + BlackPathDam + 
fit.3:     WhiteFungDam + ThripsDam + Fern + (1 | Family) + (1 | gh_bench/gh_col) + 
fit.3:     treatment:gluc_Conc
      npar    AIC    BIC  logLik deviance  Chisq Df Pr(>Chisq)  
fit.4   13 6572.4 6622.5 -3273.2   6546.4                       
fit.3   15 6570.3 6628.2 -3270.1   6540.3 6.0873  2    0.04766 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#Flavonoid Concentration has missing samples. Therefore, I refit the model with and without flav_Conc, but using the same limited dataset.
#No flav_Conc
fit.4<-lmer(GM_TotalLeaf_Area ~ treatment + gluc_Conc + BlackPathDam + WhiteFungDam +  
    ThripsDam + Fern +   treatment:gluc_Conc+ (1 | Family) + (1 | gh_bench/gh_col)  ,data=dat2[!is.na(dat2$flav_Conc),])
#Yes flav_Conc
fit.3<-lmer(GM_TotalLeaf_Area ~ treatment + gluc_Conc + BlackPathDam + WhiteFungDam +  
    ThripsDam + Fern +   treatment:gluc_Conc+flav_Conc+ (1 | Family) + (1 | gh_bench/gh_col)  ,data=dat2[!is.na(dat2$flav_Conc),])

anova(fit.3,fit.4) #Flav_Conc is a significant predictor. 
refitting model(s) with ML (instead of REML)
Data: dat2[!is.na(dat2$flav_Conc), ]
Models:
fit.4: GM_TotalLeaf_Area ~ treatment + gluc_Conc + BlackPathDam + WhiteFungDam + 
fit.4:     ThripsDam + Fern + treatment:gluc_Conc + (1 | Family) + (1 | 
fit.4:     gh_bench/gh_col)
fit.3: GM_TotalLeaf_Area ~ treatment + gluc_Conc + BlackPathDam + WhiteFungDam + 
fit.3:     ThripsDam + Fern + treatment:gluc_Conc + flav_Conc + (1 | 
fit.3:     Family) + (1 | gh_bench/gh_col)
      npar    AIC    BIC  logLik deviance  Chisq Df Pr(>Chisq)  
fit.4   14 6574.0 6628.0 -3273.0   6546.0                       
fit.3   15 6570.3 6628.2 -3270.1   6540.3 5.7058  1    0.01691 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#Now that I know flav_conc is significant, I will conduct the rest of the model simplification using the whole data set (i.e. flav_Conc excluded --fit4) 

fit.nf<-lmer(GM_TotalLeaf_Area ~ treatment + gluc_Conc + BlackPathDam + WhiteFungDam +  
    ThripsDam + Fern +   treatment:gluc_Conc+ (1 | Family) + (1 | gh_bench/gh_col)  ,data=dat2)


fit.1.nf<-update(fit.nf,~.-BlackPathDam)
anova(fit.nf,fit.1.nf) #Black pathogen damage is a significant predictor. Did not remove.
refitting model(s) with ML (instead of REML)
Data: dat2
Models:
fit.1.nf: GM_TotalLeaf_Area ~ treatment + gluc_Conc + WhiteFungDam + ThripsDam + 
fit.1.nf:     Fern + (1 | Family) + (1 | gh_bench/gh_col) + treatment:gluc_Conc
fit.nf: GM_TotalLeaf_Area ~ treatment + gluc_Conc + BlackPathDam + WhiteFungDam + 
fit.nf:     ThripsDam + Fern + treatment:gluc_Conc + (1 | Family) + (1 | 
fit.nf:     gh_bench/gh_col)
         npar    AIC    BIC  logLik deviance  Chisq Df Pr(>Chisq)   
fit.1.nf   13 6862.6 6913.3 -3418.3   6836.6                        
fit.nf     14 6854.1 6908.7 -3413.0   6826.1 10.487  1   0.001202 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
fit.2.nf<-update(fit.nf,~.-WhiteFungDam)
anova(fit.nf,fit.2.nf)  #White Fungal Damage was not significant, however, both the AIC and BIC was lower with it included, suggesting it may be an important variable. 
refitting model(s) with ML (instead of REML)
Data: dat2
Models:
fit.2.nf: GM_TotalLeaf_Area ~ treatment + gluc_Conc + BlackPathDam + ThripsDam + 
fit.2.nf:     Fern + (1 | Family) + (1 | gh_bench/gh_col) + treatment:gluc_Conc
fit.nf: GM_TotalLeaf_Area ~ treatment + gluc_Conc + BlackPathDam + WhiteFungDam + 
fit.nf:     ThripsDam + Fern + treatment:gluc_Conc + (1 | Family) + (1 | 
fit.nf:     gh_bench/gh_col)
         npar    AIC    BIC  logLik deviance  Chisq Df Pr(>Chisq)
fit.2.nf   13 6853.0 6903.7 -3413.5   6827.0                     
fit.nf     14 6854.1 6908.7 -3413.0   6826.1 0.8647  1     0.3524
dat2

fit.3.nf<-update(fit.nf,~.-ThripsDam)
anova(fit.nf,fit.3.nf)  #Thrips Damage was also not a significant predictor, however, both the AIC and BIC was lower with it included, suggesting it may be an important predictor. 
refitting model(s) with ML (instead of REML)
Data: dat2
Models:
fit.3.nf: GM_TotalLeaf_Area ~ treatment + gluc_Conc + BlackPathDam + WhiteFungDam + 
fit.3.nf:     Fern + (1 | Family) + (1 | gh_bench/gh_col) + treatment:gluc_Conc
fit.nf: GM_TotalLeaf_Area ~ treatment + gluc_Conc + BlackPathDam + WhiteFungDam + 
fit.nf:     ThripsDam + Fern + treatment:gluc_Conc + (1 | Family) + (1 | 
fit.nf:     gh_bench/gh_col)
         npar    AIC    BIC  logLik deviance  Chisq Df Pr(>Chisq)
fit.3.nf   13 6853.6 6904.3 -3413.8   6827.6                     
fit.nf     14 6854.1 6908.7 -3413.0   6826.1 1.5362  1     0.2152
fit.4.nf<-update(fit.nf,~.-Fern)
anova(fit.nf,fit.4.nf)  #Fern abundance is significnat predictor performance.
refitting model(s) with ML (instead of REML)
Data: dat2
Models:
fit.4.nf: GM_TotalLeaf_Area ~ treatment + gluc_Conc + BlackPathDam + WhiteFungDam + 
fit.4.nf:     ThripsDam + (1 | Family) + (1 | gh_bench/gh_col) + treatment:gluc_Conc
fit.nf: GM_TotalLeaf_Area ~ treatment + gluc_Conc + BlackPathDam + WhiteFungDam + 
fit.nf:     ThripsDam + Fern + treatment:gluc_Conc + (1 | Family) + (1 | 
fit.nf:     gh_bench/gh_col)
         npar    AIC    BIC  logLik deviance  Chisq Df Pr(>Chisq)  
fit.4.nf   13 6857.1 6907.8 -3415.5   6831.1                       
fit.nf     14 6854.1 6908.7 -3413.0   6826.1 4.9702  1    0.02579 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
library(lmerTest)

Attaching package: ‘lmerTest’

The following object is masked from ‘package:lme4’:

    lmer

The following object is masked from ‘package:stats’:

    step
#The best model is therefore: 

#With limited dataset containing flavonoid data
summary(lmer(GM_TotalLeaf_Area ~ treatment*gluc_Conc+Fern+BlackPathDam +flav_Conc + (1 | gh_bench/gh_col) ,data=dat2))
Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: GM_TotalLeaf_Area ~ treatment * gluc_Conc + Fern + BlackPathDam +  
    flav_Conc + (1 | gh_bench/gh_col)
   Data: dat2

REML criterion at convergence: 6417.4

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.2347 -0.5991  0.0668  0.5698  2.6996 

Random effects:
 Groups          Name        Variance Std.Dev.
 gh_col:gh_bench (Intercept)  548555   740.6  
 gh_bench        (Intercept) 1839408  1356.2  
 Residual                    7340803  2709.4  
Number of obs: 350, groups:  gh_col:gh_bench, 28; gh_bench, 5

Fixed effects:
                      Estimate Std. Error       df t value Pr(>|t|)    
(Intercept)           12088.20    2455.14   243.01   4.924 1.57e-06 ***
treatmentgm           -7338.20    2891.65   324.03  -2.538  0.01163 *  
treatmentm            -9033.07    3217.17   329.90  -2.808  0.00529 ** 
gluc_Conc             -4628.73    2410.11   323.99  -1.921  0.05567 .  
Fern                   -114.12      57.75   326.56  -1.976  0.04898 *  
BlackPathDam            -77.29      30.37   334.00  -2.545  0.01137 *  
flav_Conc              2630.10    1235.18   339.59   2.129  0.03395 *  
treatmentgm:gluc_Conc  3480.42    2920.34   322.79   1.192  0.23422    
treatmentm:gluc_Conc   8227.51    3344.05   330.58   2.460  0.01439 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) trtmntg trtmntm glc_Cn Fern   BlckPD flv_Cn trtmntg:_C
treatmentgm -0.770                                                       
treatmentm  -0.702  0.586                                                
gluc_Conc   -0.856  0.745   0.674                                        
Fern         0.012 -0.004  -0.068  -0.033                                
BlackPathDm -0.090  0.021   0.103  -0.015 -0.157                         
flav_Conc   -0.188  0.079   0.080  -0.265  0.032  0.139                  
trtmntgm:_C  0.754 -0.991  -0.575  -0.746 -0.002 -0.026 -0.058           
trtmntm:g_C  0.674 -0.562  -0.993  -0.654  0.060 -0.105 -0.079  0.558    
#with whole data set lacking flavonoid data
summary(lmer(GM_TotalLeaf_Area ~ treatment*gluc_Conc+Fern+BlackPathDam  + (1 | gh_bench/gh_col) ,data=dat2))
Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: GM_TotalLeaf_Area ~ treatment * gluc_Conc + Fern + BlackPathDam +  
    (1 | gh_bench/gh_col)
   Data: dat2

REML criterion at convergence: 6719.4

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.2385 -0.6239  0.0654  0.5901  2.7601 

Random effects:
 Groups          Name        Variance Std.Dev.
 gh_col:gh_bench (Intercept)  366692   605.6  
 gh_bench        (Intercept) 1847886  1359.4  
 Residual                    7516712  2741.7  
Number of obs: 365, groups:  gh_col:gh_bench, 28; gh_bench, 5

Fixed effects:
                      Estimate Std. Error       df t value Pr(>|t|)    
(Intercept)           13372.80    2395.82   239.92   5.582 6.42e-08 ***
treatmentgm           -8127.48    2876.85   340.56  -2.825  0.00500 ** 
treatmentm            -8903.10    3119.91   346.11  -2.854  0.00458 ** 
gluc_Conc             -3558.56    2302.70   340.35  -1.545  0.12318    
Fern                   -132.91      57.26   326.48  -2.321  0.02089 *  
BlackPathDam            -86.08      30.01   352.48  -2.868  0.00438 ** 
treatmentgm:gluc_Conc  4235.27    2905.11   339.30   1.458  0.14580    
treatmentm:gluc_Conc   8010.78    3226.04   346.86   2.483  0.01349 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) trtmntg trtmntm glc_Cn Fern   BlckPD trtmntg:_C
treatmentgm -0.767                                                
treatmentm  -0.711  0.588                                         
gluc_Conc   -0.956  0.791   0.733                                 
Fern         0.014 -0.001  -0.048  -0.021                         
BlackPathDm -0.069  0.013   0.086   0.026 -0.152                  
trtmntgm:_C  0.752 -0.991  -0.578  -0.785 -0.006 -0.020           
trtmntm:g_C  0.683 -0.565  -0.993  -0.712  0.039 -0.087  0.562    
#The negative slope associated with the alone treamtment is no longer significant, suggesting that there is only a postive slope of glucosinolates in the maple treatment. However, the issue with this analysis is that is does not account for the competitive strength of the maple competitor, which may be correlated with glucosinolate concentration. 

#Model Diagnostics.

#GlucConcInteraction
fit.Whole<-lmer(GM_TotalLeaf_Area ~ treatment*gluc_Conc + BlackPathDam+Fern+flav_Conc+
(1 | Family) + (1 | gh_bench/gh_col) ,data=dat2)

confint(fit.Whole)
Computing profile confidence intervals ...
unexpected decrease in profile: using minstepnon-monotonic profile for (Intercept)bad spline fit for (Intercept): falling back to linear interpolation
                            2.5 %       97.5 %
.sig01                   274.5891  1300.474695
.sig02                     0.0000   893.955975
.sig03                   505.4262  2820.690738
.sigma                  2439.7371  2860.032525
(Intercept)             7363.1399 16799.855507
treatmentgm           -12701.8363 -1520.475152
treatmentm            -15041.5377 -2494.142955
gluc_Conc              -9383.2299   -53.492406
BlackPathDam            -143.4638   -24.193771
Fern                    -226.2257    -3.249272
flav_Conc                383.2981  5261.207752
treatmentgm:gluc_Conc  -2445.1744  8859.601582
treatmentm:gluc_Conc    1424.5156 14497.082917
coef(fit.Whole)
$`gh_col:gh_bench`
    (Intercept) treatmentgm treatmentm gluc_Conc BlackPathDam      Fern
1:1    12561.34   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
1:2    12098.72   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
1:3    11807.58   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
1:4    11587.20   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
2:1    12068.50   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
2:2    12218.84   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
2:3    12582.12   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
2:4    12628.25   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
2:5    12073.82   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
3:1    12744.74   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
3:2    12643.83   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
3:3    12768.44   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
3:4    12095.20   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
4:1    12091.12   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
4:2    12680.35   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
4:3    12499.17   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
4:4    11946.64   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
4:5    11806.81   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
5:1    11434.61   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
5:2    11600.05   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
5:3    11202.47   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
5:4    12179.72   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
5:5    12039.70   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
6:1    12007.78   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
6:2    10946.24   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
6:3    11566.32   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
6:4    11563.01   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
6:5    11922.11   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
    flav_Conc treatmentgm:gluc_Conc treatmentm:gluc_Conc
1:1  2832.853              3201.353             7947.925
1:2  2832.853              3201.353             7947.925
1:3  2832.853              3201.353             7947.925
1:4  2832.853              3201.353             7947.925
2:1  2832.853              3201.353             7947.925
2:2  2832.853              3201.353             7947.925
2:3  2832.853              3201.353             7947.925
2:4  2832.853              3201.353             7947.925
2:5  2832.853              3201.353             7947.925
3:1  2832.853              3201.353             7947.925
3:2  2832.853              3201.353             7947.925
3:3  2832.853              3201.353             7947.925
3:4  2832.853              3201.353             7947.925
4:1  2832.853              3201.353             7947.925
4:2  2832.853              3201.353             7947.925
4:3  2832.853              3201.353             7947.925
4:4  2832.853              3201.353             7947.925
4:5  2832.853              3201.353             7947.925
5:1  2832.853              3201.353             7947.925
5:2  2832.853              3201.353             7947.925
5:3  2832.853              3201.353             7947.925
5:4  2832.853              3201.353             7947.925
5:5  2832.853              3201.353             7947.925
6:1  2832.853              3201.353             7947.925
6:2  2832.853              3201.353             7947.925
6:3  2832.853              3201.353             7947.925
6:4  2832.853              3201.353             7947.925
6:5  2832.853              3201.353             7947.925

$Family
        (Intercept) treatmentgm treatmentm gluc_Conc BlackPathDam      Fern
BWPEM1     11892.98   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
CBMCK1     12266.13   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
CRSOSO     12294.71   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
CWRIC2     12114.65   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
DVGM       12208.20   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
EFCC2      11950.95   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
JARI1      12149.84   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
JBBLB2     11746.59   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
JBCHY1     11365.44   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
JWBOY      12441.57   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
KVEDG1     11739.19   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
MAVBEL2    12114.27   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
MHBUR1     12122.75   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
MHNAT1     11951.90   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
MSMID1     12144.45   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
PDVRT1     12163.71   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
RULEB1     12164.85   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
SMAKC1     12023.88   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
SMITH1     12551.35   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
VRCAN      11833.99   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
VRPET2     12018.79   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
VSGARO1    11938.44   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
WSSWM3     11922.34   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
        flav_Conc treatmentgm:gluc_Conc treatmentm:gluc_Conc
BWPEM1   2832.853              3201.353             7947.925
CBMCK1   2832.853              3201.353             7947.925
CRSOSO   2832.853              3201.353             7947.925
CWRIC2   2832.853              3201.353             7947.925
DVGM     2832.853              3201.353             7947.925
EFCC2    2832.853              3201.353             7947.925
JARI1    2832.853              3201.353             7947.925
JBBLB2   2832.853              3201.353             7947.925
JBCHY1   2832.853              3201.353             7947.925
JWBOY    2832.853              3201.353             7947.925
KVEDG1   2832.853              3201.353             7947.925
MAVBEL2  2832.853              3201.353             7947.925
MHBUR1   2832.853              3201.353             7947.925
MHNAT1   2832.853              3201.353             7947.925
MSMID1   2832.853              3201.353             7947.925
PDVRT1   2832.853              3201.353             7947.925
RULEB1   2832.853              3201.353             7947.925
SMAKC1   2832.853              3201.353             7947.925
SMITH1   2832.853              3201.353             7947.925
VRCAN    2832.853              3201.353             7947.925
VRPET2   2832.853              3201.353             7947.925
VSGARO1  2832.853              3201.353             7947.925
WSSWM3   2832.853              3201.353             7947.925

$gh_bench
  (Intercept) treatmentgm treatmentm gluc_Conc BlackPathDam      Fern
1    13929.35   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
2    11729.79   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
3    12457.09   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
4    11155.54   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
5    10971.92   -7099.007  -8758.159 -4720.332    -83.21952 -115.3353
  flav_Conc treatmentgm:gluc_Conc treatmentm:gluc_Conc
1  2832.853              3201.353             7947.925
2  2832.853              3201.353             7947.925
3  2832.853              3201.353             7947.925
4  2832.853              3201.353             7947.925
5  2832.853              3201.353             7947.925

attr(,"class")
[1] "coef.mer"
#no heteroscedasticity
plot(fit.Whole)

#fairly normal. 
qqnorm(resid(fit.Whole))


#The model appears to be a good fit.

#Visualization – The conditional benefit of glucosinolates (allelopathy)


aloneSlope<-function(x){
  y=-3966.60*x+ 13751.96
  return(y)
}
mapleSlope<-function(x){
  y=(-4254.2+8417.95)*x+13751.96 -9243.71
  return(y)
}

mustardSlope<-function(x){
  y=+13751.96-8376.67#Non significant slope
  return(y)
}

minM<-min(dat2$gluc_Conc[dat2$treatment=="m"],na.rm = T)
maxM<-max(dat2$gluc_Conc[dat2$treatment=="m"],na.rm = T)

minA<-min(dat2$gluc_Conc[dat2$treatment=="a"],na.rm = T)
maxA<-max(dat2$gluc_Conc[dat2$treatment=="a"],na.rm = T)

minG<-min(dat2$gluc_Conc[dat2$treatment=="gm"],na.rm = T)
maxG<-max(dat2$gluc_Conc[dat2$treatment=="gm"],na.rm = T)

#tiff("Selection_Figures/Gluc_Benefit.tiff", units="in", width=10, height=6, res=300)
library(ggplot2)
ggplot(dat2)+
  geom_point(aes(y=GM_TotalLeaf_Area,x=gluc_Conc,colour=treatment),size=2)+
  geom_segment(x=minA,xend=maxA,y=aloneSlope(minA),yend=aloneSlope(maxA),colour="#009E73",size=1.5)+
    geom_segment(x=minM,xend=maxM,y=mapleSlope(minM),yend=mapleSlope(maxM),colour="#E69F00",size=1.5)+
  geom_segment(x=minG,xend=maxG,y=mustardSlope(minG),yend=mustardSlope(maxG),colour="#56B4E9",size=1.5)+theme_simple()+
  ylab(bquote(bold("Performance\n(Total Leaf Area "~(mm^2)~")")))+xlab(bquote(bold("[Total Glucosinolate] " (mg/ml))))+
  scale_colour_manual(values=c("#009E73","#56B4E9","#E69F00"),labels=c("Alone","Garlic Mustard","Maple"))

#dev.off()

minA
[1] 0.7713421

#Visualizing the effect of flavonoid on fitness.

summary(lmer(GM_TotalLeaf_Area~treatment+flav_Conc+BlackPathDam+Fern+(1|Family)+(1|gh_bench/gh_col), data=dat2))
Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: GM_TotalLeaf_Area ~ treatment + flav_Conc + BlackPathDam + Fern +  
    (1 | Family) + (1 | gh_bench/gh_col)
   Data: dat2

REML criterion at convergence: 6473.8

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.1990 -0.6278  0.0560  0.6004  2.6495 

Random effects:
 Groups          Name        Variance Std.Dev.
 gh_col:gh_bench (Intercept)  660632   812.8  
 Family          (Intercept)  210327   458.6  
 gh_bench        (Intercept) 1767108  1329.3  
 Residual                    7165525  2676.8  
Number of obs: 350, groups:  gh_col:gh_bench, 28; Family, 23; gh_bench, 5

Fixed effects:
             Estimate Std. Error       df t value Pr(>|t|)    
(Intercept)   7682.44    1156.80    33.30   6.641 1.42e-07 ***
treatmentgm  -3897.18     385.80   333.76 -10.102  < 2e-16 ***
treatmentm   -1133.35     364.02   330.79  -3.113  0.00201 ** 
flav_Conc     2471.19    1040.31   341.75   2.375  0.01808 *  
BlackPathDam   -77.69      30.19   335.79  -2.573  0.01050 *  
Fern          -125.75      57.56   330.33  -2.185  0.02962 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) trtmntg trtmntm flv_Cn BlckPD
treatmentgm -0.294                              
treatmentm  -0.260  0.475                       
flav_Conc   -0.795  0.198   0.137               
BlackPathDm -0.163 -0.043   0.021   0.090       
Fern        -0.035 -0.037  -0.073   0.030 -0.156
aloneSlope<-function(x){
  y=2024.62 *x+  8035.30
  return(y)
}
mapleSlope<-function(x){
  y=(2024.62 )*x+ 8035.30 -1067.02
  return(y)
}

mustardSlope<-function(x){
  y=2024.62 *x+ 8035.30-3746.91#Non significant slope
  return(y)
}

minM<-min(dat2$flav_Conc[dat2$treatment=="m"],na.rm = T)
maxM<-max(dat2$flav_Conc[dat2$treatment=="m"],na.rm = T)

minA<-min(dat2$flav_Conc[dat2$treatment=="a"],na.rm = T)
maxA<-max(dat2$flav_Conc[dat2$treatment=="a"],na.rm = T)

minG<-min(dat2$flav_Conc[dat2$treatment=="gm"],na.rm = T)
maxG<-max(dat2$flav_Conc[dat2$treatment=="gm"],na.rm = T)


#tiff("Selection_Figures/Flav_Benefit.tiff", units="in", width=10, height=6, res=300)
ggplot(dat2)+
  geom_point(aes(y=GM_TotalLeaf_Area,x=flav_Conc,colour=treatment),size=2)+
  geom_segment(x=minA,xend=maxA,y=aloneSlope(minA),yend=aloneSlope(maxA),colour="#009E73",size=1.5)+
    geom_segment(x=minM,xend=maxM,y=mapleSlope(minM),yend=mapleSlope(maxM),colour="#E69F00",size=1.5)+theme_simple()+
  geom_segment(x=minG,xend=maxG,y=mustardSlope(minG),yend=mustardSlope(maxG),colour="#56B4E9",size=1.5)+theme_simple()+
  ylab(bquote(bold("Performance\n(Total Leaf Area "~(mm^2)~")")))+xlab(bquote(bold("[Total Flavonoid] " (mg/ml))))+
  scale_colour_manual(values=c("#009E73","#56B4E9","#E69F00"),labels=c("Alone","Garlic Mustard","Maple"))

#dev.off()

#Visualization– The Detriment of pathogens and ferns

summary(lmer(GM_TotalLeaf_Area ~ Fern+
(1 | Family) + (1 | gh_bench/gh_col) ,data=dat2))
boundary (singular) fit: see ?isSingular
Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: GM_TotalLeaf_Area ~ Fern + (1 | Family) + (1 | gh_bench/gh_col)
   Data: dat2

REML criterion at convergence: 9607.6

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.85397 -0.70508  0.04291  0.74619  3.11787 

Random effects:
 Groups          Name        Variance Std.Dev.
 gh_col:gh_bench (Intercept)    96624  310.8  
 Family          (Intercept)        0    0.0  
 gh_bench        (Intercept)  2947085 1716.7  
 Residual                    10094168 3177.1  
Number of obs: 507, groups:  gh_col:gh_bench, 28; Family, 23; gh_bench, 5

Fixed effects:
            Estimate Std. Error       df t value Pr(>|t|)    
(Intercept) 7896.911    807.136    4.071   9.784 0.000561 ***
Fern        -226.020     56.097  432.082  -4.029 6.61e-05 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
     (Intr)
Fern -0.055
convergence code: 0
boundary (singular) fit: see ?isSingular
a<-ggplot(dat2)+
  geom_point(aes(y=GM_TotalLeaf_Area,x=BlackPathDam))+theme_simple_multiCol()+
  geom_abline(intercept=8281.76,slope = -105.28,size=1.5)+
  xlab("Black Pathogen Damage")

b<-ggplot(dat2[dat2$WhiteFungDam<30,])+
  geom_point(aes(y=GM_TotalLeaf_Area,x=WhiteFungDam),colour="#999999")+theme_simple_multiCol()+
  theme(axis.title.x = element_text(color = "#999999", size = 16, face = "bold",margin=margin(3,0,3,0)),
      )+xlab("Powdery Mildew Damage")

c<-ggplot(dat2)+
  geom_point(aes(y=GM_TotalLeaf_Area,x=ThripsDam),colour="#E69F00")+theme_simple_multiCol()+xlab("Thrips Damage")+
    theme(axis.title.x = element_text(color = "#E69F00", size = 16, face = "bold",margin=margin(3,0,3,0)))

d<-ggplot(dat2)+
  geom_point(aes(y=GM_TotalLeaf_Area,x=Fern),colour="#009E73")+theme_simple_multiCol()+xlab("Fern Abundance")+
   geom_abline(intercept=8003.44,slope = -179.47,size=1.5,color="#009E73")+
  theme(axis.title.x = element_text(color = "#009E73", size = 16, face = "bold",margin=margin(3,0,3,0)))
   


plot<-plot_grid(a, b,ncol=2,rel_widths = c(1,1))
Removed 61 rows containing missing values (geom_point).Removed 61 rows containing missing values (geom_point).
plot2<-plot_grid(d, c,ncol=2,rel_widths = c(1,1))
Removed 9 rows containing missing values (geom_point).Removed 61 rows containing missing values (geom_point).
plot3<-plot_grid(a,b,c,d,ncol=2,rel_widths = c(1,1))
Removed 61 rows containing missing values (geom_point).Removed 61 rows containing missing values (geom_point).Removed 61 rows containing missing values (geom_point).Removed 9 rows containing missing values (geom_point).
plot4<-plot_grid(a,b,c,ncol=1,rel_widths = c(1,1,1))
Removed 61 rows containing missing values (geom_point).Removed 61 rows containing missing values (geom_point).Removed 61 rows containing missing values (geom_point).
plot5<-plot_grid(a,b,c,ncol=3,rel_widths = c(1,1,1))
Removed 61 rows containing missing values (geom_point).Removed 61 rows containing missing values (geom_point).Removed 61 rows containing missing values (geom_point).
y.grob<-textGrob(bquote(bold("Shoot Area "(mm^2))),gp=gpar(fontface="bold",fontsize=20),rot=90)


#tiff("Selection_Figures/PathogenEffect.tiff", units="in", width=14, height=6, res=300)
grid.arrange(plot,left=y.grob)

#dev.off()

#tiff("Selection_Figures/PathogenEffect2.tiff", units="in", width=14, height=6, res=300)
grid.arrange(plot2,left=y.grob)

#dev.off()

#tiff("Selection_Figures/PathogenEffect3.tiff", units="in", width=14, height=10, res=300)
grid.arrange(plot3,left=y.grob)

#dev.off

grid.arrange(plot4,left=y.grob)



#tiff("Selection_Figures/PathogenEffect5.tiff", units="in", width=16, height=5, res=300)
grid.arrange(plot5,left=y.grob)

#dev.off

#tiff("Selection_Figures/FernEffect.tiff", units="in", width=8, height=6, res=300)
grid.arrange(d,left=y.grob)

#dev.off

#—————————————– #Part 2

#Influence of gluc and flav on defence.


hist(dat$Fern)

hist(dat$ThripsDam)

hist(dat$WhiteFungDam)

hist(dat$BlackPathDam)


#This data is very zero inflated and a poisson model will be too overdispersed. I am afraid that a negative binomial will be as well. 

#Significant testing

#WhitePathDam – logistic regression

#Because of how zero inflated white pathogen damage is, i will use a logistic regression to model it.
dat2$WhiteFungLogis<-NA
dat2$WhiteFungLogis[dat2$WhiteFungDam==0]<-0
dat2$WhiteFungLogis[dat2$WhiteFungDam>0]<-1


#This is the biggest model that could converge. ... interaction with flavonoid could not.
fit_full_g<-glmer(WhiteFungLogis~treatment*gluc_Conc+flav_Conc+(1|Family),family=binomial,data=dat2[!is.na(dat2$flav_Conc),])

fit.1<-update(fit_full_g,~.-flav_Conc)
anova(fit_full_g,fit.1) #Flavonoid Concentration is not significant. 
Data: dat2[!is.na(dat2$flav_Conc), ]
Models:
fit.1: WhiteFungLogis ~ treatment + gluc_Conc + (1 | Family) + treatment:gluc_Conc
fit_full_g: WhiteFungLogis ~ treatment * gluc_Conc + flav_Conc + (1 | Family)
           npar    AIC    BIC  logLik deviance  Chisq Df Pr(>Chisq)
fit.1         7 402.61 429.62 -194.31   388.61                     
fit_full_g    8 403.89 434.76 -193.95   387.89 0.7204  1      0.396
#Testing glucosinolate treatment interaction. 
fit.2<-glmer(WhiteFungLogis~treatment*gluc_Conc+(1|Family),family=binomial,data=dat2)
Model failed to converge with max|grad| = 0.00272048 (tol = 0.002, component 1)
fit.3<-glmer(WhiteFungLogis~treatment+gluc_Conc+(1|Family),family=binomial,data=dat2)
anova(fit.2,fit.3) #Glucosinolate:Treatment interaction is not significant.
Data: dat2
Models:
fit.3: WhiteFungLogis ~ treatment + gluc_Conc + (1 | Family)
fit.2: WhiteFungLogis ~ treatment * gluc_Conc + (1 | Family)
      npar    AIC    BIC  logLik deviance  Chisq Df Pr(>Chisq)
fit.3    5 416.98 436.48 -203.49   406.98                     
fit.2    7 416.63 443.93 -201.32   402.63 4.3439  2      0.114
#Testing glucosinolate involvment at all.
fit.4<-glmer(WhiteFungLogis~treatment+(1|Family),family=binomial,data=dat2[!is.na(dat2$gluc_Conc),])
fit.3<-glmer(WhiteFungLogis~treatment+gluc_Conc+(1|Family),family=binomial,data=dat2[!is.na(dat2$gluc_Conc),])
anova(fit.4,fit.3) #Glucosinolate Concentration is not a significant predictor
Data: dat2[!is.na(dat2$gluc_Conc), ]
Models:
fit.4: WhiteFungLogis ~ treatment + (1 | Family)
fit.3: WhiteFungLogis ~ treatment + gluc_Conc + (1 | Family)
      npar    AIC    BIC  logLik deviance  Chisq Df Pr(>Chisq)
fit.4    4 415.04 430.64 -203.52   407.04                     
fit.3    5 416.98 436.48 -203.49   406.98 0.0644  1     0.7997
#Testing effect of treatment
fit.4<-glmer(WhiteFungLogis~treatment+(1|Family),family=binomial,data=dat2)
fit.5<-glmer(WhiteFungLogis~1+(1|Family),family=binomial,data=dat2)
anova(fit.4,fit.5)
Data: dat2
Models:
fit.5: WhiteFungLogis ~ 1 + (1 | Family)
fit.4: WhiteFungLogis ~ treatment + (1 | Family)
      npar    AIC    BIC  logLik deviance  Chisq Df Pr(>Chisq)  
fit.5    2 523.93 532.17 -259.97   519.93                       
fit.4    4 519.23 535.71 -255.62   511.23 8.7022  2    0.01289 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#treatment is significant......

summary(fit.4) #Garlic mustard in the maple treatment have less occurence of fungal colonization. 
Generalized linear mixed model fit by maximum likelihood (Laplace
  Approximation) [glmerMod]
 Family: binomial  ( logit )
Formula: WhiteFungLogis ~ treatment + (1 | Family)
   Data: dat2

     AIC      BIC   logLik deviance df.resid 
   519.2    535.7   -255.6    511.2      451 

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.3885 -0.6239 -0.4587  0.9947  3.3329 

Random effects:
 Groups Name        Variance Std.Dev.
 Family (Intercept) 0.544    0.7376  
Number of obs: 455, groups:  Family, 23

Fixed effects:
            Estimate Std. Error z value Pr(>|z|)   
(Intercept)  -0.6835     0.2395  -2.854  0.00431 **
treatmentgm  -0.4101     0.2613  -1.569  0.11656   
treatmentm   -0.8037     0.2756  -2.916  0.00355 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) trtmntg
treatmentgm -0.509        
treatmentm  -0.474  0.447 
plot(fit.4)

#Visualizing – effect of treatment on proportion of fungal abundance.

#Summarizing for Display: generating frequency of white funal infection by treatment
plot<-dat2 %>% drop_na(WhiteFungLogis) %>% group_by(treatment) %>% summarize(PercWhitFung=sum(WhiteFungLogis)/length(WhiteFungLogis)*100)


#tiff("Defence_Figures/TreatMeanWhiteFung.tiff", units="in", width=8, height=5, res=300)
ggplot(plot)+
  geom_col(aes(x=treatment,y=PercWhitFung,fill=treatment))+theme_simple()+ylab("Fungal Abundance\n (% Infected)")+
  scale_y_continuous(breaks = seq(0,30,5))+
scale_x_discrete(name="",labels=c("Alone","Garlic Mustard","Maple"))+
  scale_fill_manual(values=c("#009E73","#56B4E9","#E69F00"),labels=c("Alone","Garlic Mustard","Maple"))+
  theme_simple_multiCol()+theme(axis.title.y =  element_text(color = "black", size = 16, face = "bold",margin=margin(3,20,3,0)))

#dev.off()

#Visualizing — the distribution of pathogens by treatment.


plot2<-dat2 %>% drop_na(BlackPathDam) %>% group_by(treatment) %>% summarize(BlackPathAve=mean(BlackPathDam,na.rm=T))

plot3<-dat2 %>% drop_na(ThripsDam) %>% group_by(treatment) %>% summarize(ThripsDam=mean(ThripsDam,na.rm=T))

plot4<-dat2 %>% drop_na(Fern) %>% group_by(treatment) %>% summarize(Fern=mean(Fern,na.rm=T))


#Black Pathogen abundance by treamtent
ggplot(plot2)+
  geom_col(aes(x=treatment,y=BlackPathAve,fill=treatment))+theme_simple()+ylab("Fungal Abundance\n (% colonized)")+xlab("Treatment")+theme(legend.position = "none")


#Thrips abundance by treatment. 
ggplot(plot3)+
  geom_col(aes(x=treatment,y=ThripsDam,fill=treatment))+theme_simple()+ylab("Fungal Abundance\n (% colonized)")+xlab("Treatment")+theme(legend.position = "none")


#I would need to account for the garlic mustard being psuedoreplicated iwth the fern data, because each gm in the gm treatment was grown with another gm in the same pot. 
ggplot(plot4)+
  geom_col(aes(x=treatment,y=Fern,fill=treatment))+theme_simple()+ylab("Average Fern Abundance (#Ferns/pot)")+xlab("Treatment")+theme(legend.position = "none")+
  scale_x_discrete(name="",labels=c("Alone","Garlic Mustard","Maple"))+
  scale_fill_manual(values=c("#009E73","#56B4E9","#E69F00"),labels=c("Alone","Garlic Mustard","Maple"))+
  theme_simple_multiCol()+theme(axis.title.y =  element_text(color = "black", size = 16, face = "bold",margin=margin(3,20,3,0)))

#dev.off()

#Modelling – what influences White pathogen damage?

#Rounding to integers for white fung dam. 
dat$WhiteFungDam<-ceiling(dat$WhiteFungDam)

fit_full<-glmer(WhiteFungDam~treatment*gluc_Conc+treatment*flav_Conc+(1|Family/Tag)+(1|gh_bench),family=poisson,data=dat)
Model failed to converge with max|grad| = 1.93052 (tol = 0.002, component 1)
fit.1<-update(fit_full,~.-flav_Conc:treatment)
Model failed to converge with max|grad| = 0.368802 (tol = 0.002, component 1)
anova(fit.1,fit_full) #Fit1 is a better model
Data: dat
Models:
fit.1: WhiteFungDam ~ treatment + gluc_Conc + flav_Conc + (1 | Family/Tag) + 
fit.1:     (1 | gh_bench) + treatment:gluc_Conc
fit_full: WhiteFungDam ~ treatment * gluc_Conc + treatment * flav_Conc + 
fit_full:     (1 | Family/Tag) + (1 | gh_bench)
         npar    AIC    BIC  logLik deviance Chisq Df Pr(>Chisq)
fit.1      10 1011.1 1056.3 -495.53   991.06                    
fit_full   12 1016.3 1070.6 -496.15   992.29     0  2          1
fit.2<-update(fit.1,~.-gluc_Conc:treatment)
boundary (singular) fit: see ?isSingular
anova(fit.2,fit.1) #models are the same... eliminating interaction.
Data: dat
Models:
fit.2: WhiteFungDam ~ treatment + gluc_Conc + flav_Conc + (1 | Family/Tag) + 
fit.2:     (1 | gh_bench)
fit.1: WhiteFungDam ~ treatment + gluc_Conc + flav_Conc + (1 | Family/Tag) + 
fit.1:     (1 | gh_bench) + treatment:gluc_Conc
      npar    AIC    BIC  logLik deviance  Chisq Df Pr(>Chisq)
fit.2    8 1010.9 1047.1 -497.43   994.85                     
fit.1   10 1011.1 1056.3 -495.53   991.06 3.7917  2     0.1502
fit.3<-update(fit.2,~.-gluc_Conc)
boundary (singular) fit: see ?isSingular
anova(fit.3,fit.2) #The model including glucConc is better. 
Data: dat
Models:
fit.3: WhiteFungDam ~ treatment + flav_Conc + (1 | Family/Tag) + (1 | 
fit.3:     gh_bench)
fit.2: WhiteFungDam ~ treatment + gluc_Conc + flav_Conc + (1 | Family/Tag) + 
fit.2:     (1 | gh_bench)
      npar    AIC    BIC  logLik deviance  Chisq Df Pr(>Chisq)   
fit.3    7 1019.2 1050.9 -502.60  1005.21                        
fit.2    8 1010.9 1047.1 -497.43   994.85 10.356  1   0.001291 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
fit.2<-update(fit.2,data=dat[!is.na(dat$flav_Conc),]) #Using a model with a data subset.
boundary (singular) fit: see ?isSingular
fit.3<-update(fit.2,~.-flav_Conc) 
boundary (singular) fit: see ?isSingular
anova(fit.3,fit.2)#flav_Conc is unimportant, even though the AIC and BIC are lower.
Data: dat[!is.na(dat$flav_Conc), ]
Models:
fit.3: WhiteFungDam ~ treatment + gluc_Conc + (1 | Family/Tag) + (1 | 
fit.3:     gh_bench)
fit.2: WhiteFungDam ~ treatment + gluc_Conc + flav_Conc + (1 | Family/Tag) + 
fit.2:     (1 | gh_bench)
      npar    AIC    BIC  logLik deviance  Chisq Df Pr(>Chisq)
fit.3    7 1009.4 1041.1 -497.71   995.42                     
fit.2    8 1010.9 1047.1 -497.43   994.85 0.5708  1       0.45
#Therefore, the best model is:
summary(glmer(WhiteFungDam~treatment+gluc_Conc+(1|Family/Tag)+(1|gh_bench),family=poisson,data=dat))
boundary (singular) fit: see ?isSingular
Generalized linear mixed model fit by maximum likelihood (Laplace
  Approximation) [glmerMod]
 Family: poisson  ( log )
Formula: WhiteFungDam ~ treatment + gluc_Conc + (1 | Family/Tag) + (1 |  
    gh_bench)
   Data: dat

     AIC      BIC   logLik deviance df.resid 
  1033.7   1065.6   -509.9   1019.7      697 

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.0689 -0.2817 -0.2273 -0.1792  2.4492 

Random effects:
 Groups     Name        Variance Std.Dev.
 Tag:Family (Intercept) 3.5607   1.8870  
 Family     (Intercept) 0.1535   0.3918  
 gh_bench   (Intercept) 0.0000   0.0000  
Number of obs: 704, groups:  Tag:Family, 433; Family, 23; gh_bench, 5

Fixed effects:
            Estimate Std. Error z value Pr(>|z|)   
(Intercept) -0.19132    0.74202  -0.258  0.79653   
treatmentgm  0.03378    0.33151   0.102  0.91883   
treatmentm  -0.81258    0.35172  -2.310  0.02087 * 
gluc_Conc   -2.32106    0.71153  -3.262  0.00111 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) trtmntg trtmntm
treatmentgm -0.306                
treatmentm  -0.341  0.484         
gluc_Conc   -0.907  0.126   0.175 
convergence code: 0
boundary (singular) fit: see ?isSingular
#the inclusion of GH_Bench does not affect the outcome of the model, thereofre, I am excluding it as the other model was saturated and took alot time to compute. 
summary(glmer(WhiteFungDam~treatment+gluc_Conc+(1|Family/Tag),family=poisson,data=dat))
Generalized linear mixed model fit by maximum likelihood (Laplace
  Approximation) [glmerMod]
 Family: poisson  ( log )
Formula: WhiteFungDam ~ treatment + gluc_Conc + (1 | Family/Tag)
   Data: dat

     AIC      BIC   logLik deviance df.resid 
  1031.7   1059.1   -509.9   1019.7      698 

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.0689 -0.2816 -0.2273 -0.1792  2.4492 

Random effects:
 Groups     Name        Variance Std.Dev.
 Tag:Family (Intercept) 3.5609   1.8870  
 Family     (Intercept) 0.1535   0.3918  
Number of obs: 704, groups:  Tag:Family, 433; Family, 23

Fixed effects:
            Estimate Std. Error z value Pr(>|z|)   
(Intercept) -0.19135    0.74206  -0.258  0.79651   
treatmentgm  0.03379    0.33152   0.102  0.91882   
treatmentm  -0.81257    0.35173  -2.310  0.02088 * 
gluc_Conc   -2.32108    0.71157  -3.262  0.00111 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) trtmntg trtmntm
treatmentgm -0.306                
treatmentm  -0.341  0.484         
gluc_Conc   -0.907  0.126   0.175 
#Using a Permutation test to determine the probability of getting a significant glucosinolate concentration predictor, if the data is ramdomly sampled. 

datPerTest<-dat
pStore<-c()
for(i in 1:100){
  #Randomize glucosinolate concentration.
  datPerTest$gluc_Conc<-sample(dat$gluc_Conc,length(dat$gluc_Conc),replace = F)
  
  #Run Model with randomized glucConc and extract p-value
  glucPval<-summary(glmer(WhiteFungDam~treatment+gluc_Conc+(1|Family/Tag),family=poisson,data=datPerTest))$coef[3,4]
  
  #Store P value.
  pStore[i]<-glucPval
}
boundary (singular) fit: see ?isSingular
unable to evaluate scaled gradientModel failed to converge: degenerate  Hessian with 2 negative eigenvaluesvariance-covariance matrix computed from finite-difference Hessian is
not positive definite or contains NA values: falling back to var-cov estimated from RXvariance-covariance matrix computed from finite-difference Hessian is
not positive definite or contains NA values: falling back to var-cov estimated from RXboundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular
Model failed to converge with max|grad| = 0.115676 (tol = 0.002, component 1)Model is nearly unidentifiable: very large eigenvalue
 - Rescale variables?boundary (singular) fit: see ?isSingular
Model failed to converge with max|grad| = 0.11074 (tol = 0.002, component 1)Model is nearly unidentifiable: very large eigenvalue
 - Rescale variables?boundary (singular) fit: see ?isSingular
boundary (singular) fit: see ?isSingular

#Visuallizing – white fungal damage is influenced by gluc and treatmnet.


PoisSlope=function(x,int){
  y=exp(-2.32292*x+int)
  return(y)
}

glucplot=seq(min(dat$gluc_Conc),max(dat$gluc_Conc),length.out = 695)

FungA<-PoisSlope(glucplot,-0.15701)
FungM<-PoisSlope(glucplot,-0.15701-0.82060)
FungGM<-PoisSlope(glucplot,-0.15701+0.02483)

fit.g<-glm(WhiteFungDam~gluc_Conc+treatment,family=poisson,data=dat)
summary(fit.g)

predict(fit.g,type="response",newdata=data.frame("treatment"=rep("a",695),"gluc_Conc"=glucplot))

datv<-dat[!is.na(dat$WhiteFungDam),]

#tiff("Defence_Figures/GlucosinolateFungi.tiff", units="in", width=10, height=6, res=300)
ggplot(datv[datv$WhiteFungDam<30,])+
  geom_point(aes(y=WhiteFungDam,x=gluc_Conc,colour=treatment))+
    scale_colour_manual(values=c("#009E73","#56B4E9","#E69F00","#009E73","#56B4E9","#E69F00"),labels=c("Alone","Garlic Mustard","Maple"))+theme_simple()+
  scale_y_continuous(breaks=c(0,2,4,6,8,10,12))+
  geom_path(x=glucplot,y=FungA,colour="#009E73")+
  geom_path(x=glucplot,y=FungM,colour="#E69F00")+
  ylab("Powdery Mildew Damage")+
xlab(bquote(bold("[Total Glucosinolate] " (mg/ml))))
#dev.off()

#Modelling – What influences Black Pathogen Damage?

sum(pStore<0.05)/length(pStore)
[1] 0.56

#Visuallizing – Black Pathogen damage is influenced by flavonols.



PoisSlope=function(x){
  y=exp(-1.1150*x+1.6816)
  return(y)
}


flavplot=seq(min(dat$flav_Conc,na.rm = T),max(dat$flav_Conc,na.rm=T),length.out = 687)

flavy<-PoisSlope(flavplot)

#tiff("Defence_Figures/FlavonoidBlackPath.tiff", units="in", width=10, height=6, res=300)
ggplot(dat[!is.na(dat$flav_Conc)&!is.na(dat$flav_Conc),])+
  geom_point(aes(y=BlackPathDam,x=flav_Conc))+theme_simple()+
  geom_path(x=flavplot,y=flavy,size=1,colour="#999999")+
  
  scale_y_continuous(breaks=c(0,5,10,15,20,25,30))+
  ylab("Black Pathogen Damage")+
xlab(bquote(bold("[Total Flavonoid] " (mg/ml))))
#dev.off()

#What influences Thrips damage?

sum(pStore<0.05)/length(pStore)
[1] 0.47

#Visualizing - influence of flavonoids on thrips damage.


PoisSlope=function(x){
  y=exp(-2.3319*x+3.5249)
  return(y)
}


flavplot=seq(min(dat$flav_Conc,na.rm = T),max(dat$flav_Conc,na.rm=T),length.out = 687)

flavy<-PoisSlope(flavplot)

#tiff("Defence_Figures/FlavonoidThrips.tiff", units="in", width=10, height=6, res=300)
ggplot(dat[!is.na(dat$flav_Conc)&!is.na(dat$flav_Conc),])+
  geom_point(aes(y=ThripsDam,x=flav_Conc))+theme_simple()+
  geom_path(x=flavplot,y=flavy,size=1,colour="#999999")+
  
  scale_y_continuous(breaks=c(0,5,10,15,20,25,30,35,40))+
  ylab("Thrips Damage")+
xlab(bquote(bold("[Total Flavonoid] " (mg/ml))))
#dev.off()

#Visualizing – effect of flavonoids on fern abundance.


PoisSlope=function(x,int){
  y=exp((-0.02353 -3.12475)*x+int)
  return(y)
}
exp(-0.6571)

flavplot=seq(min(dat$flav_Conc,na.rm = T),max(dat$flav_Conc,na.rm=T),length.out = 707)

flavyA<-PoisSlope(flavplot,-2.1683)
flavyM<-PoisSlope(flavplot,-1.60546-2.81450)
flavyGM<-PoisSlope(flavplot,-2.1683-0.2786)


#tiff("Defence_Figures/FlavonoidFern.tiff", units="in", width=10, height=6, res=300)
ggplot(dat)+
  geom_point(aes(y=Fern,x=flav_Conc,colour=treatment))+theme_simple()+
 # geom_path(x=flavplot,y=flavyA,size=1,colour="#009E73")
  #geom_path(x=flavplot,y=flavyGM,size=1,colour="#56B4E9")
  geom_path(x=flavplot,y=flavyM,size=1,colour="#E69F00")+
      scale_colour_manual(values=c("#009E73","#56B4E9","#E69F00"),labels=c("Alone","Garlic Mustard","Maple"))+
  scale_y_continuous(breaks=c(0,5,10,15,20,25,30,35,40))+
  ylab("Fern Abundance")+
xlab(bquote(bold("[Total Flavonoid] " (mg/ml))))
#dev.off()

How can we know that healthy plants dont just exhibit more secondary compounds and not that those with more secondary compounds are healthier?

LS0tCnRpdGxlOiAiU2VsZWN0aXZlIGJlbmVmaXQgb2YgR2x1Y29zaW5vbGF0ZSBhbmQgZmxhdm9ub2lkcyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQojUGFydCAxClRoZSBwdXJwb3NlIG9mIHRoaXMgbm90ZWJvb2sgaXMgdG8gZGV0ZXJtaW5lIHRoZSBzZWxlY3RpdmUgYmVuZWZpdCBvZiBnbHVjb3Npbm9sYXRlIGFuZCBmbGF2b25vaWQgY29tcG91bmRzIHRocm91Z2ggcGxhbnQgY29tcGV0aXRpb24gYnkgY3JlYXRpbmcgc2VsZWN0aW9uIGdyYWRpZW50cy4gU2VsZWN0aW9uIGdyYWRpZW50cyB3aWxsIGludm9sdmUgZmluYWwgYm9keSBtYXNzIGFzIHRoZSBwcm94eSBmb3IgZml0bmVzcywgYnV0IHRoaXMgd2lsbCBiZSByZXBsYWNlZCB3aXRoIGZpdG5lc3Mgb25jZSB0aGUgbWVhc3VyZW1lbnQgaXMgaW4uIENvbmNlbnRyYXRpb24gd2lsbCBiZSBvbiB0aGUgeC1heGlzLiBUaGlzIGFuYWx5c2lzIHdpbGwgYWNjb3VudCBmb3IgZmFtaWx5IGFuZCBncmVlbmhvdXNlIGxvY2F0aW9uLiAKCiNQYXJ0IDIKVGhlIHNlY29uZCBwdXJwb3NlIGlzIHRvIGRldGVybWluZSBpZiBnbHVjb3Npbm9sYXRlcyBhbmQgZmxhdm9ub2lkcyBpbmZsdWVuY2Ugc3VzY3BldGliaWxpdHkgdG8gcGF0aG9nZW5zIGFuZCBpZiB0aGlzIHN1c2NlcHRpYmlsaXR5IHJlc3VsdHMgaW4gaW5jcmVhc2VkIGZpdG5lc3MKCgoKCiNSZWFkIGluIGFuZCBwcmVwIGRhdGEKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShsbWU0KQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KGNvd3Bsb3QpCmxpYnJhcnkoZ3JpZCkKbGlicmFyeShncmlkRXh0cmEpCmxpYnJhcnkoZHBseXIpCnNvdXJjZSgiR0dQbG90X1RoZW1lcy5SIikKCiNyZWFkIGluIGRhdGEKcm0obGlzdD1scygpKQpkYXQ8LXJlYWQuY3N2KCJEYXRhU3ludGhlc2lzLmNzdiIpCgojUmVtb3ZlIG1hcGxlIGNvbnRyb2xzIGRhdGEgZnJvbSB0aGUgZGF0YSBzZXQuCmRhdDwtZGF0ICU+JSBmaWx0ZXIodHJlYXRtZW50IT0ibWNudCIpICU+JSBkcm9wbGV2ZWxzKCkKCiNBc3NpZ24gZmFtaWx5IGNvbHVtbgpwcmVmYW1pbHk8LWdzdWIoIiouXFx8IiwiIixkYXQkVGFnKQpkYXQkRmFtaWx5PC1nc3ViKCJcXC0uKiIsIiIscHJlZmFtaWx5KQoKI3JlbW92ZSB0aG9zZSB3aXRoIGZlcnRpbGl6ZXIgdHJlYXRtZW50LCBhbmQgZXh0cmEgZ2Vub3R5cGVzIHRoYXQgYXJlIG9ubHkgaW4gdGhlIGFsb25lIHRyZWF0bWVudC4gCmRhdDwtZGF0WyFncmVwbCgiaSIsZGF0JFNhbXBsZSxmaXhlZD1UKSxdCgojSW5pdGlhbGl6aW5nIGNvbHVtbnMgdG8gYXZvaWQgY29uc3RhbnQgZXJyb3IgbWVzc2FnZXMuIApkYXQkV2hpdGVGdW5nTG9naXM8LU5BCmRhdCRCbGFja0Z1bmdMb2dpczwtTkEKYGBgCgoKI0dlbmVyYXRpbmcgZGF0YSBmcmFtZXMgd2l0aCBzdW1tYXJpemVkIGxlYWYgZGF0YSAoZGF0MikgYW5kIHN1bW1hcml6ZWQgZ2Vub3R5cGUgZGF0YSAoZGF0MykKYGBge3J9CiNTdW1tYXJpemluZzogVGFraW5nIHRoZSBtZWFuIHZhbHVlIG9mIGxlYXZlcy4gVGhpcyB0aWJibGUgY29udGFpbnMgZGF0YSBhdCB0aGUgbGV2ZWwgb2YgdGhlIHBsYW50IG1lYW5zLiAKZGF0MjwtZGF0ICU+JSBncm91cF9ieShUYWcpICU+JSBzdW1tYXJpemUoQ2hsb3JBPW1lYW4oQ2hsb3JBKSxDaGxvckI9bWVhbihDaGxvckIpLGdsdWNfQ29uYz1tZWFuKGdsdWNfQ29uYyksZmxhdl9Db25jPW1lYW4oZmxhdl9Db25jKSxGYW1pbHk9Zmlyc3QoRmFtaWx5KSx0cmVhdG1lbnQ9Zmlyc3QodHJlYXRtZW50KSxnaF9yb3c9Zmlyc3QoZ2hfcm93KSxnaF9iZW5jaD1maXJzdChnaF9iZW5jaCksR01fVG90YWxMZWFmX0FyZWE9Zmlyc3QoR01fVG90YWxMZWFmX0FyZWEpLGNvbXBfbnVtYmVyPWZpcnN0KGNvbXBfbnVtYmVyKSxUaHJpcHNEYW09bWVhbihUaHJpcHNEYW0pLFdoaXRlRnVuZ0RhbT1tZWFuKFdoaXRlRnVuZ0RhbSksQmxhY2tQYXRoRGFtPW1lYW4oQmxhY2tQYXRoRGFtKSxGZXJuPW1lYW4oRmVybiksZ2hfY29sPWZpcnN0KGdoX2NvbCkpCgoKI0FsbCBvZiB0aGVzZSBnZW5vdHlwZXMgZGllZCAoMTUgR2Vub3R5cGVzKS4oV2UgYXJlIHNpbXBseSBtaXNzaW5nIGEgZmluYWwgbWVhc3VyZW1lbnQgZm9yIGV8SkJDSFkxLTEtNTB8UXwyNDApIFRoYXQgaXMgb25seSAzJSBNb3J0YWxpdHkuIApkZWFkPC1kYXQyW2lzLm5hKGRhdDIkR01fVG90YWxMZWFmX0FyZWEpLF0KCiNSZW1vdmluZyB0aG9zZSB3aXRoIGRlYWQgY29tcGV0aXRvcnMgZnJvbSB0aGUgZ2FybGljIG11c3RhcmQgdHJlYXRtZW50LiAoImV8SkJDSFkxLTEtNTB8UXwyNDAiKSBkaWQgbm90IGRpZSwgd2UgYXJlIHNpbXBseSBtaXNzaW5nIHRoZSBmaW5hbCBtZWFzdXJlbWVudCBmb3IgaXQuCgpkZWFkX2NvbXBldGl0b3JzPC1kZWFkICU+JSBmaWx0ZXIodHJlYXRtZW50PT0iZ20iLFRhZyE9ImV8SkJDSFkxLTEtNTB8UXwyNDAiKSAlPiUgc2VsZWN0KGNvbXBfbnVtYmVyKQoKI1JlbW92aW5nIHRob3NlIHdpdGggZGVhZCBjb21wZXRpdG9ycyBmcm9tIHRoZSBhbmFseXNpcy4gCmRhdDI8LWRhdDIgJT4lIGZpbHRlcighY29tcF9udW1iZXIgJWluJSBkZWFkX2NvbXBldGl0b3JzJGNvbXBfbnVtYmVyKQoKCiMjU3VtbWFyaXppbmc6IFRha2luZyB0aGUgbWVhbiB2YWx1ZSBvZiBwbGFudHMuIFRoaXMgdGliYmxlIGNvbnRhaW5zIGRhdGEgYXQgdGhlIGxldmVsIG9mIHRoZSBmYW1pbHkgbWVhbnMgd2l0aGluIGVhY2ggdHJlYXRtZW50LiAKZGF0MzwtZGF0MiAlPiUgZHJvcF9uYShHTV9Ub3RhbExlYWZfQXJlYSkgJT4lIGdyb3VwX2J5KEZhbWlseSx0cmVhdG1lbnQpICAlPiUgc3VtbWFyaXplX2lmKGlzLm51bWVyaWMsbWVhbikKCmBgYAoKCiNTZWFyY2hpbmcgZm9yIGEgZml0bmVzcyB0cmFkZS1vZmYgYmV0d2VlbiB0aGUgYWxvbmUgYW5kIGludGVyc3BlY2lmaWMgY29tcGV0aXRpb24gdHJlYXRtZW50LiAKYGBge3J9CnNvdXJjZSgiR0dQbG90X1RoZW1lcy5SIikKCiNDYWxjdWxhdGluZyBmYW1pbHkgbWVhbnMgd2l0aGluIHRyZWF0bWVudC4gClRyYWRlT2ZmPC1kYXQzICU+JSBmaWx0ZXIodHJlYXRtZW50PT0iYSIpICU+JSBkcm9wX25hKEdNX1RvdGFsTGVhZl9BcmVhKSAlPiUgIHNlbGVjdChMZWFmU2l6ZUFsb25lPUdNX1RvdGFsTGVhZl9BcmVhLEZhbWlseSxnbHVjX0NvbmNBbG9uZT1nbHVjX0NvbmMpICU+JSByaWdodF9qb2luKGRhdDMgJT4lIGZpbHRlcih0cmVhdG1lbnQ9PSJtIikgJT4lICBzZWxlY3QoTGVhZlNpemVNYXBsZT1HTV9Ub3RhbExlYWZfQXJlYSxGYW1pbHksZ2x1Y19Db25jTWFwbGU9Z2x1Y19Db25jKSxieT0iRmFtaWx5IikKCiNDYWxjdWxhdGluZyBzdGFuZGFyZCBlcnJvciBvZiBlYWNoIGZhbWlseQpTdGRFcnI8LWRhdDIgJT4lIHNlbGVjdChGYW1pbHksdHJlYXRtZW50LEdNX1RvdGFsTGVhZl9BcmVhKSAlPiUgZ3JvdXBfYnkoRmFtaWx5LHRyZWF0bWVudCkgJT4lIGRyb3BfbmEoR01fVG90YWxMZWFmX0FyZWEpICU+JSAgc3VtbWFyaXplKFN0ZEVycj1zZChHTV9Ub3RhbExlYWZfQXJlYSkvc3FydChsZW5ndGgoR01fVG90YWxMZWFmX0FyZWEpKSxzaXplPWxlbmd0aChHTV9Ub3RhbExlYWZfQXJlYSkpCgojU2hpZnRpbmcgdGhlIGRhdGEgdG8gYmUgaW4gbG9uZyBmb3JtLiAKU3RkRXJyMjwtU3RkRXJyICU+JSBmaWx0ZXIodHJlYXRtZW50PT0iYSIpICU+JSBzZWxlY3QoU3RkRXJyQWxvbmU9U3RkRXJyLEZhbWlseSkgJT4lIHJpZ2h0X2pvaW4oU3RkRXJyICU+JSBmaWx0ZXIodHJlYXRtZW50PT0ibSIpICU+JSBzZWxlY3QoU3RkRXJyTWFwbGU9U3RkRXJyLEZhbWlseSksYnk9IkZhbWlseSIpCgpUcmFkZU9mZjI8LVN0ZEVycjIgJT4lIGxlZnRfam9pbihUcmFkZU9mZikKCgojdGlmZigiU2VsZWN0aW9uX0ZpZ3VyZXMvVHJhZGVPZmYudGlmZiIsIHVuaXRzPSJpbiIsIHdpZHRoPTEwLCBoZWlnaHQ9NiwgcmVzPTMwMCkKCmdncGxvdChUcmFkZU9mZjIsYWVzKHk9TGVhZlNpemVBbG9uZSx4PUxlYWZTaXplTWFwbGUpKSsKICBnZW9tX3BvaW50KCkrCiAgZ2VvbV9saW5lcmFuZ2UoYWVzKHltaW4gPSBMZWFmU2l6ZUFsb25lIC0gU3RkRXJyQWxvbmUsIAogICAgICAgICAgICAgICAgICAgIHltYXggPSBMZWFmU2l6ZUFsb25lICsgU3RkRXJyQWxvbmUpKSsKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IExlYWZTaXplTWFwbGUgLSBTdGRFcnJNYXBsZSwKICAgICAgICAgICAgICAgICAgICB4bWF4ID0gTGVhZlNpemVNYXBsZSArIFN0ZEVyck1hcGxlKSkrCnRoZW1lX3NpbXBsZSgpKwogIHhsYWIoIlBlcmZvcm1hbmNlIHdpdGggTWFwbGUiKSsKICB5bGFiKCJQZXJmb3JtYW5jZSBBbG9uZSIpCiNkZXYub2ZmKCkKc3VtbWFyeShsbShMZWFmU2l6ZUFsb25lfkxlYWZTaXplTWFwbGUsZGF0YT1UcmFkZU9mZjIpKQoKYGBgCgoKCgoKI1Zpc3VhbGl6aW5nIGdlbmV0aWMgdmFyaWF0aW9uIGFuZCBncmVlbmhvdXNlIHZhcmlhdGlvbiwgd2hpY2ggd2lsbCBiZSBjb250cm9sbGVkIGZvci4gCmBgYHtyfQojR0ggQmVuY2gKZ2dwbG90KGRhdDIpKwogIGdlb21fcG9pbnQoYWVzKHk9Z2x1Y19Db25jLHg9Z2hfYmVuY2gsY29sb3VyPWFzLmZhY3RvcihnaF9iZW5jaCkpKQoKI0dIIENvbApnZ3Bsb3QoZGF0MikrCiAgZ2VvbV9wb2ludChhZXMoeT1nbHVjX0NvbmMseD1naF9jb2wsY29sb3VyPWFzLmZhY3RvcihnaF9iZW5jaCkpKQoKI0ludmVzdGlnYXRpbmcgZ2VuZXRpYyBkaWZmZXJlbmNlcyBieSB0cmVhdG1lbnQKI2dsdWNfQ29uYwpib3hwbG90KGdsdWNfQ29uY35GYW1pbHksZGF0YT1kYXQyW2RhdDIkdHJlYXRtZW50PT0iYSIsXSkKYm94cGxvdChnbHVjX0NvbmN+RmFtaWx5LGRhdGE9ZGF0MltkYXQyJHRyZWF0bWVudD09Im0iLF0pCmJveHBsb3QoZ2x1Y19Db25jfkZhbWlseSxkYXRhPWRhdDJbZGF0MiR0cmVhdG1lbnQ9PSJnbSIsXSkKI2JvZHltYXNzCmJveHBsb3QoR01fVG90YWxMZWFmX0FyZWF+RmFtaWx5LGRhdGE9ZGF0MltkYXQyJHRyZWF0bWVudD09ImEiLF0pCmJveHBsb3QoR01fVG90YWxMZWFmX0FyZWF+RmFtaWx5LGRhdGE9ZGF0MltkYXQyJHRyZWF0bWVudD09Im0iLF0pCmJveHBsb3QoR01fVG90YWxMZWFmX0FyZWF+RmFtaWx5LGRhdGE9ZGF0MltkYXQyJHRyZWF0bWVudD09ImdtIixdKQpgYGAKCgoKI01vZGVsbGluZzogV2hhdCBpbmZsdWVuY2VzIHBlcmZvcm1hbmNlICh0b3RhbCBsZWFmIGFyZWEpCmBgYHtyfQojVGhpcyBpcyB0aGUgZnVsbCBtb2RlbC5JIGV4cGVjdCB0aGF0IHRoZSBpbmZsdWVuY2Ugb2YgZ2x1YyBjb25jIGFuZCBmbGF2IGNvbmMgY291bGQgdmFyeSBiZXR3ZWVuIHRyZWF0bWVudHMgYmVjYXVzZSBvZiBhbGxlbG9wYXRoeSwgdGhlcmVmb3JlLCBpIGluY2x1ZGUgaW50ZXJhY3Rpb25zIHdpdGggdGhlc2UgdmFyaWFibGVzLiBIb3dldmVyLCBpIGhhdmUgbm8gcmVhc29uIHRvIHRoaW5rIHRoYXQgcGF0aG9nZW5zIG9yIGZlcm4gYWJ1bmRhbmNlIGNvdWxkIGluZmx1ZW5jZSBmaXRuZXNzIGRpZmZlcmVudGx5IGluIGRpZmZlcmVudCB0cmVhdG1lbnRzLCB0aGVyZWZvcmUsIG5vIGludGVyYWN0aW9ucyBhcmUgaW5jbHVkZWQuCgojRmlyc3QgbGV0cyBlbnN1cmUgd2UgYXJlIHVzaW5nIHRoZSBjb3JyZWN0IHJhbmRvbSBlZmZlY3RzLgpmaXRmdWxsMDwtbG1lcihHTV9Ub3RhbExlYWZfQXJlYX50cmVhdG1lbnQqZ2x1Y19Db25jKmZsYXZfQ29uYytCbGFja1BhdGhEYW0rV2hpdGVGdW5nRGFtK1Rocmlwc0RhbStGZXJuKygxfEZhbWlseSksIGRhdGE9ZGF0MikKCmZpdGZ1bGw8LWxtZXIoR01fVG90YWxMZWFmX0FyZWF+dHJlYXRtZW50KmdsdWNfQ29uYypmbGF2X0NvbmMrQmxhY2tQYXRoRGFtK1doaXRlRnVuZ0RhbStUaHJpcHNEYW0rRmVybisoMXxGYW1pbHkpKygxfGdoX2JlbmNoKSwgZGF0YT1kYXQyKQoKZml0ZnVsbDI8LWxtZXIoR01fVG90YWxMZWFmX0FyZWF+dHJlYXRtZW50KmdsdWNfQ29uYypmbGF2X0NvbmMrQmxhY2tQYXRoRGFtK1doaXRlRnVuZ0RhbStUaHJpcHNEYW0rRmVybisoMXxGYW1pbHkpKygxfGdoX2JlbmNoL2doX3JvdyksIGRhdGE9ZGF0MikKCmZpdGZ1bGwzPC1sbWVyKEdNX1RvdGFsTGVhZl9BcmVhfnRyZWF0bWVudCpnbHVjX0NvbmMqZmxhdl9Db25jK0JsYWNrUGF0aERhbStXaGl0ZUZ1bmdEYW0rVGhyaXBzRGFtK0Zlcm4rKDF8RmFtaWx5KSsoMXxnaF9iZW5jaC9naF9jb2wpLCBkYXRhPWRhdDIpCgphbm92YShmaXRmdWxsMCxmaXRmdWxsKSAjU3Ryb25nIGV2aWRlbmNlIHRvIHVzZSBiZW5jaC4KYW5vdmEoZml0ZnVsbCxmaXRmdWxsMikgI1VzaW5nIGJlbmNoL3JvdyBpcyB0aGUgc2FtZSBhcyB0aGUgbnVsbCBtb2RlbC4KYW5vdmEoZml0ZnVsbCxmaXRmdWxsMykgI1RoZXJlIGlzIGV2aWRlbmNlIHRvIHVzZSBiZW5jaC9jb2xsdW1uIGhvd2V2ZXIuIAoKI01vZGVsbGluZyBmaXhlZCBlZmZlY3RzLiAtLS0tLS0tLS0tLQoKI0Z1bGwgTW9kZWwKZml0ZnVsbDM8LWxtZXIoR01fVG90YWxMZWFmX0FyZWF+dHJlYXRtZW50KmdsdWNfQ29uYypmbGF2X0NvbmMrQmxhY2tQYXRoRGFtK1doaXRlRnVuZ0RhbStUaHJpcHNEYW0rRmVybisoMXxGYW1pbHkpKygxfGdoX2JlbmNoL2doX2NvbCksIGRhdGE9ZGF0MikKCiNSZW1vdmluZyB0aHJlZSB3YXkgaW50ZXJhY3Rpb24KZml0LjE8LXVwZGF0ZShmaXRmdWxsMywgfi4tdHJlYXRtZW50OmdsdWNfQ29uYzpmbGF2X0NvbmMpCmFub3ZhKGZpdGZ1bGwzLGZpdC4xKSAjR29vZCB0byByZW1vdmUKCiNSZW1vdmluZyB0d28gd2F5IGludGVyYWN0aW9uIGdsdWM6ZmxhdgpmaXQuMjwtdXBkYXRlKGZpdC4xLH4uLWdsdWNfQ29uYzpmbGF2X0NvbmMpCmFub3ZhKGZpdC4yLGZpdC4xKSAjR29vZCB0byByZW1vdmUuIAoKI1JlbW92aW5nIHRyZWF0bWVudDpmbGF2b25vaWQgaW50ZXJhY3Rpb25zCmZpdC4zPC11cGRhdGUoZml0LjIsfi4tdHJlYXRtZW50OmZsYXZfQ29uYykKYW5vdmEoZml0LjIsZml0LjMpICNHb29kIHRvIHJlbW92ZS4gCgpmaXQuNDwtdXBkYXRlKGZpdC4zLH4uLXRyZWF0bWVudDpnbHVjX0NvbmMpCmFub3ZhKGZpdC40LGZpdC4zKSAgI1RoYXQgc2lnbmlmaWNhbnRseSBhZmZlY3RlZCB0aGUgcHJlZGljdGl2ZSBwb3dlci4gRGlkIE5vdCBSZW1vdmUgCgojRmxhdm9ub2lkIENvbmNlbnRyYXRpb24gaGFzIG1pc3Npbmcgc2FtcGxlcy4gVGhlcmVmb3JlLCBJIHJlZml0IHRoZSBtb2RlbCB3aXRoIGFuZCB3aXRob3V0IGZsYXZfQ29uYywgYnV0IHVzaW5nIHRoZSBzYW1lIGxpbWl0ZWQgZGF0YXNldC4KI05vIGZsYXZfQ29uYwpmaXQuNDwtbG1lcihHTV9Ub3RhbExlYWZfQXJlYSB+IHRyZWF0bWVudCArIGdsdWNfQ29uYyArIEJsYWNrUGF0aERhbSArIFdoaXRlRnVuZ0RhbSArICAKICAgIFRocmlwc0RhbSArIEZlcm4gKyAgIHRyZWF0bWVudDpnbHVjX0NvbmMrICgxIHwgRmFtaWx5KSArICgxIHwgZ2hfYmVuY2gvZ2hfY29sKSAgLGRhdGE9ZGF0MlshaXMubmEoZGF0MiRmbGF2X0NvbmMpLF0pCiNZZXMgZmxhdl9Db25jCmZpdC4zPC1sbWVyKEdNX1RvdGFsTGVhZl9BcmVhIH4gdHJlYXRtZW50ICsgZ2x1Y19Db25jICsgQmxhY2tQYXRoRGFtICsgV2hpdGVGdW5nRGFtICsgIAogICAgVGhyaXBzRGFtICsgRmVybiArICAgdHJlYXRtZW50OmdsdWNfQ29uYytmbGF2X0NvbmMrICgxIHwgRmFtaWx5KSArICgxIHwgZ2hfYmVuY2gvZ2hfY29sKSAgLGRhdGE9ZGF0MlshaXMubmEoZGF0MiRmbGF2X0NvbmMpLF0pCgphbm92YShmaXQuMyxmaXQuNCkgI0ZsYXZfQ29uYyBpcyBhIHNpZ25pZmljYW50IHByZWRpY3Rvci4gCgojTm93IHRoYXQgSSBrbm93IGZsYXZfY29uYyBpcyBzaWduaWZpY2FudCwgSSB3aWxsIGNvbmR1Y3QgdGhlIHJlc3Qgb2YgdGhlIG1vZGVsIHNpbXBsaWZpY2F0aW9uIHVzaW5nIHRoZSB3aG9sZSBkYXRhIHNldCAoaS5lLiBmbGF2X0NvbmMgZXhjbHVkZWQgLS1maXQ0KSAKCmZpdC5uZjwtbG1lcihHTV9Ub3RhbExlYWZfQXJlYSB+IHRyZWF0bWVudCArIGdsdWNfQ29uYyArIEJsYWNrUGF0aERhbSArIFdoaXRlRnVuZ0RhbSArICAKICAgIFRocmlwc0RhbSArIEZlcm4gKyAgIHRyZWF0bWVudDpnbHVjX0NvbmMrICgxIHwgRmFtaWx5KSArICgxIHwgZ2hfYmVuY2gvZ2hfY29sKSAgLGRhdGE9ZGF0MikKCgpmaXQuMS5uZjwtdXBkYXRlKGZpdC5uZix+Li1CbGFja1BhdGhEYW0pCmFub3ZhKGZpdC5uZixmaXQuMS5uZikgI0JsYWNrIHBhdGhvZ2VuIGRhbWFnZSBpcyBhIHNpZ25pZmljYW50IHByZWRpY3Rvci4gRGlkIG5vdCByZW1vdmUuCgpmaXQuMi5uZjwtdXBkYXRlKGZpdC5uZix+Li1XaGl0ZUZ1bmdEYW0pCmFub3ZhKGZpdC5uZixmaXQuMi5uZikgICNXaGl0ZSBGdW5nYWwgRGFtYWdlIHdhcyBub3Qgc2lnbmlmaWNhbnQsIGhvd2V2ZXIsIGJvdGggdGhlIEFJQyBhbmQgQklDIHdhcyBsb3dlciB3aXRoIGl0IGluY2x1ZGVkLCBzdWdnZXN0aW5nIGl0IG1heSBiZSBhbiBpbXBvcnRhbnQgdmFyaWFibGUuIApkYXQyCgpmaXQuMy5uZjwtdXBkYXRlKGZpdC5uZix+Li1UaHJpcHNEYW0pCmFub3ZhKGZpdC5uZixmaXQuMy5uZikgICNUaHJpcHMgRGFtYWdlIHdhcyBhbHNvIG5vdCBhIHNpZ25pZmljYW50IHByZWRpY3RvciwgaG93ZXZlciwgYm90aCB0aGUgQUlDIGFuZCBCSUMgd2FzIGxvd2VyIHdpdGggaXQgaW5jbHVkZWQsIHN1Z2dlc3RpbmcgaXQgbWF5IGJlIGFuIGltcG9ydGFudCBwcmVkaWN0b3IuIAoKZml0LjQubmY8LXVwZGF0ZShmaXQubmYsfi4tRmVybikKYW5vdmEoZml0Lm5mLGZpdC40Lm5mKSAgI0Zlcm4gYWJ1bmRhbmNlIGlzIHNpZ25pZmljbmF0IHByZWRpY3RvciBwZXJmb3JtYW5jZS4KCgpsaWJyYXJ5KGxtZXJUZXN0KQojVGhlIGJlc3QgbW9kZWwgaXMgdGhlcmVmb3JlOiAKCiNXaXRoIGxpbWl0ZWQgZGF0YXNldCBjb250YWluaW5nIGZsYXZvbm9pZCBkYXRhCnN1bW1hcnkobG1lcihHTV9Ub3RhbExlYWZfQXJlYSB+IHRyZWF0bWVudCpnbHVjX0NvbmMrRmVybitCbGFja1BhdGhEYW0gK2ZsYXZfQ29uYyArICgxIHwgZ2hfYmVuY2gvZ2hfY29sKSAsZGF0YT1kYXQyKSkKCiN3aXRoIHdob2xlIGRhdGEgc2V0IGxhY2tpbmcgZmxhdm9ub2lkIGRhdGEKc3VtbWFyeShsbWVyKEdNX1RvdGFsTGVhZl9BcmVhIH4gdHJlYXRtZW50KmdsdWNfQ29uYytGZXJuK0JsYWNrUGF0aERhbSAgKyAoMSB8IGdoX2JlbmNoL2doX2NvbCkgLGRhdGE9ZGF0MikpCgojVGhlIG5lZ2F0aXZlIHNsb3BlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWxvbmUgdHJlYW10bWVudCBpcyBubyBsb25nZXIgc2lnbmlmaWNhbnQsIHN1Z2dlc3RpbmcgdGhhdCB0aGVyZSBpcyBvbmx5IGEgcG9zdGl2ZSBzbG9wZSBvZiBnbHVjb3Npbm9sYXRlcyBpbiB0aGUgbWFwbGUgdHJlYXRtZW50LiBIb3dldmVyLCB0aGUgaXNzdWUgd2l0aCB0aGlzIGFuYWx5c2lzIGlzIHRoYXQgaXMgZG9lcyBub3QgYWNjb3VudCBmb3IgdGhlIGNvbXBldGl0aXZlIHN0cmVuZ3RoIG9mIHRoZSBtYXBsZSBjb21wZXRpdG9yLCB3aGljaCBtYXkgYmUgY29ycmVsYXRlZCB3aXRoIGdsdWNvc2lub2xhdGUgY29uY2VudHJhdGlvbi4gCgoKCgpgYGAKCgojTW9kZWwgRGlhZ25vc3RpY3MuIApgYGB7cn0KI0dsdWNDb25jSW50ZXJhY3Rpb24KZml0Lldob2xlPC1sbWVyKEdNX1RvdGFsTGVhZl9BcmVhIH4gdHJlYXRtZW50KmdsdWNfQ29uYyArIEJsYWNrUGF0aERhbStGZXJuK2ZsYXZfQ29uYysKKDEgfCBGYW1pbHkpICsgKDEgfCBnaF9iZW5jaC9naF9jb2wpICxkYXRhPWRhdDIpCgpjb25maW50KGZpdC5XaG9sZSkKCmNvZWYoZml0Lldob2xlKQojbm8gaGV0ZXJvc2NlZGFzdGljaXR5CnBsb3QoZml0Lldob2xlKQojZmFpcmx5IG5vcm1hbC4gCnFxbm9ybShyZXNpZChmaXQuV2hvbGUpKQoKI1RoZSBtb2RlbCBhcHBlYXJzIHRvIGJlIGEgZ29vZCBmaXQuCmBgYAoKCiNWaXN1YWxpemF0aW9uIC0tIFRoZSBjb25kaXRpb25hbCBiZW5lZml0IG9mIGdsdWNvc2lub2xhdGVzIChhbGxlbG9wYXRoeSkKYGBge3J9CgphbG9uZVNsb3BlPC1mdW5jdGlvbih4KXsKICB5PS0zOTY2LjYwKngrIDEzNzUxLjk2CiAgcmV0dXJuKHkpCn0KbWFwbGVTbG9wZTwtZnVuY3Rpb24oeCl7CiAgeT0oLTQyNTQuMis4NDE3Ljk1KSp4KzEzNzUxLjk2IC05MjQzLjcxCiAgcmV0dXJuKHkpCn0KCm11c3RhcmRTbG9wZTwtZnVuY3Rpb24oeCl7CiAgeT0rMTM3NTEuOTYtODM3Ni42NyNOb24gc2lnbmlmaWNhbnQgc2xvcGUKICByZXR1cm4oeSkKfQoKbWluTTwtbWluKGRhdDIkZ2x1Y19Db25jW2RhdDIkdHJlYXRtZW50PT0ibSJdLG5hLnJtID0gVCkKbWF4TTwtbWF4KGRhdDIkZ2x1Y19Db25jW2RhdDIkdHJlYXRtZW50PT0ibSJdLG5hLnJtID0gVCkKCm1pbkE8LW1pbihkYXQyJGdsdWNfQ29uY1tkYXQyJHRyZWF0bWVudD09ImEiXSxuYS5ybSA9IFQpCm1heEE8LW1heChkYXQyJGdsdWNfQ29uY1tkYXQyJHRyZWF0bWVudD09ImEiXSxuYS5ybSA9IFQpCgptaW5HPC1taW4oZGF0MiRnbHVjX0NvbmNbZGF0MiR0cmVhdG1lbnQ9PSJnbSJdLG5hLnJtID0gVCkKbWF4RzwtbWF4KGRhdDIkZ2x1Y19Db25jW2RhdDIkdHJlYXRtZW50PT0iZ20iXSxuYS5ybSA9IFQpCgojdGlmZigiU2VsZWN0aW9uX0ZpZ3VyZXMvR2x1Y19CZW5lZml0LnRpZmYiLCB1bml0cz0iaW4iLCB3aWR0aD0xMCwgaGVpZ2h0PTYsIHJlcz0zMDApCmxpYnJhcnkoZ2dwbG90MikKZ2dwbG90KGRhdDIpKwogIGdlb21fcG9pbnQoYWVzKHk9R01fVG90YWxMZWFmX0FyZWEseD1nbHVjX0NvbmMsY29sb3VyPXRyZWF0bWVudCksc2l6ZT0yKSsKICBnZW9tX3NlZ21lbnQoeD1taW5BLHhlbmQ9bWF4QSx5PWFsb25lU2xvcGUobWluQSkseWVuZD1hbG9uZVNsb3BlKG1heEEpLGNvbG91cj0iIzAwOUU3MyIsc2l6ZT0xLjUpKwogICAgZ2VvbV9zZWdtZW50KHg9bWluTSx4ZW5kPW1heE0seT1tYXBsZVNsb3BlKG1pbk0pLHllbmQ9bWFwbGVTbG9wZShtYXhNKSxjb2xvdXI9IiNFNjlGMDAiLHNpemU9MS41KSsKICBnZW9tX3NlZ21lbnQoeD1taW5HLHhlbmQ9bWF4Ryx5PW11c3RhcmRTbG9wZShtaW5HKSx5ZW5kPW11c3RhcmRTbG9wZShtYXhHKSxjb2xvdXI9IiM1NkI0RTkiLHNpemU9MS41KSt0aGVtZV9zaW1wbGUoKSsKICB5bGFiKGJxdW90ZShib2xkKCJQZXJmb3JtYW5jZVxuKFRvdGFsIExlYWYgQXJlYSAifihtbV4yKX4iKSIpKSkreGxhYihicXVvdGUoYm9sZCgiW1RvdGFsIEdsdWNvc2lub2xhdGVdICIgKG1nL21sKSkpKSsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1jKCIjMDA5RTczIiwiIzU2QjRFOSIsIiNFNjlGMDAiKSxsYWJlbHM9YygiQWxvbmUiLCJHYXJsaWMgTXVzdGFyZCIsIk1hcGxlIikpCiNkZXYub2ZmKCkKCm1pbkEKCgpgYGAKCiNWaXN1YWxpemluZyB0aGUgZWZmZWN0IG9mIGZsYXZvbm9pZCBvbiBmaXRuZXNzLgpgYGB7cn0Kc3VtbWFyeShsbWVyKEdNX1RvdGFsTGVhZl9BcmVhfnRyZWF0bWVudCtmbGF2X0NvbmMrQmxhY2tQYXRoRGFtK0Zlcm4rKDF8RmFtaWx5KSsoMXxnaF9iZW5jaC9naF9jb2wpLCBkYXRhPWRhdDIpKQoKYWxvbmVTbG9wZTwtZnVuY3Rpb24oeCl7CiAgeT0yMDI0LjYyICp4KyAgODAzNS4zMAogIHJldHVybih5KQp9Cm1hcGxlU2xvcGU8LWZ1bmN0aW9uKHgpewogIHk9KDIwMjQuNjIgKSp4KyA4MDM1LjMwIC0xMDY3LjAyCiAgcmV0dXJuKHkpCn0KCm11c3RhcmRTbG9wZTwtZnVuY3Rpb24oeCl7CiAgeT0yMDI0LjYyICp4KyA4MDM1LjMwLTM3NDYuOTEjTm9uIHNpZ25pZmljYW50IHNsb3BlCiAgcmV0dXJuKHkpCn0KCm1pbk08LW1pbihkYXQyJGZsYXZfQ29uY1tkYXQyJHRyZWF0bWVudD09Im0iXSxuYS5ybSA9IFQpCm1heE08LW1heChkYXQyJGZsYXZfQ29uY1tkYXQyJHRyZWF0bWVudD09Im0iXSxuYS5ybSA9IFQpCgptaW5BPC1taW4oZGF0MiRmbGF2X0NvbmNbZGF0MiR0cmVhdG1lbnQ9PSJhIl0sbmEucm0gPSBUKQptYXhBPC1tYXgoZGF0MiRmbGF2X0NvbmNbZGF0MiR0cmVhdG1lbnQ9PSJhIl0sbmEucm0gPSBUKQoKbWluRzwtbWluKGRhdDIkZmxhdl9Db25jW2RhdDIkdHJlYXRtZW50PT0iZ20iXSxuYS5ybSA9IFQpCm1heEc8LW1heChkYXQyJGZsYXZfQ29uY1tkYXQyJHRyZWF0bWVudD09ImdtIl0sbmEucm0gPSBUKQoKCiN0aWZmKCJTZWxlY3Rpb25fRmlndXJlcy9GbGF2X0JlbmVmaXQudGlmZiIsIHVuaXRzPSJpbiIsIHdpZHRoPTEwLCBoZWlnaHQ9NiwgcmVzPTMwMCkKZ2dwbG90KGRhdDIpKwogIGdlb21fcG9pbnQoYWVzKHk9R01fVG90YWxMZWFmX0FyZWEseD1mbGF2X0NvbmMsY29sb3VyPXRyZWF0bWVudCksc2l6ZT0yKSsKICBnZW9tX3NlZ21lbnQoeD1taW5BLHhlbmQ9bWF4QSx5PWFsb25lU2xvcGUobWluQSkseWVuZD1hbG9uZVNsb3BlKG1heEEpLGNvbG91cj0iIzAwOUU3MyIsc2l6ZT0xLjUpKwogICAgZ2VvbV9zZWdtZW50KHg9bWluTSx4ZW5kPW1heE0seT1tYXBsZVNsb3BlKG1pbk0pLHllbmQ9bWFwbGVTbG9wZShtYXhNKSxjb2xvdXI9IiNFNjlGMDAiLHNpemU9MS41KSt0aGVtZV9zaW1wbGUoKSsKICBnZW9tX3NlZ21lbnQoeD1taW5HLHhlbmQ9bWF4Ryx5PW11c3RhcmRTbG9wZShtaW5HKSx5ZW5kPW11c3RhcmRTbG9wZShtYXhHKSxjb2xvdXI9IiM1NkI0RTkiLHNpemU9MS41KSt0aGVtZV9zaW1wbGUoKSsKICB5bGFiKGJxdW90ZShib2xkKCJQZXJmb3JtYW5jZVxuKFRvdGFsIExlYWYgQXJlYSAifihtbV4yKX4iKSIpKSkreGxhYihicXVvdGUoYm9sZCgiW1RvdGFsIEZsYXZvbm9pZF0gIiAobWcvbWwpKSkpKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWMoIiMwMDlFNzMiLCIjNTZCNEU5IiwiI0U2OUYwMCIpLGxhYmVscz1jKCJBbG9uZSIsIkdhcmxpYyBNdXN0YXJkIiwiTWFwbGUiKSkKI2Rldi5vZmYoKQpgYGAKCiNWaXN1YWxpemF0aW9uLS0gVGhlIERldHJpbWVudCBvZiBwYXRob2dlbnMgYW5kIGZlcm5zCmBgYHtyfQpzdW1tYXJ5KGxtZXIoR01fVG90YWxMZWFmX0FyZWEgfiBGZXJuKwooMSB8IEZhbWlseSkgKyAoMSB8IGdoX2JlbmNoL2doX2NvbCkgLGRhdGE9ZGF0MikpCgphPC1nZ3Bsb3QoZGF0MikrCiAgZ2VvbV9wb2ludChhZXMoeT1HTV9Ub3RhbExlYWZfQXJlYSx4PUJsYWNrUGF0aERhbSkpK3RoZW1lX3NpbXBsZV9tdWx0aUNvbCgpKwogIGdlb21fYWJsaW5lKGludGVyY2VwdD04MjgxLjc2LHNsb3BlID0gLTEwNS4yOCxzaXplPTEuNSkrCiAgeGxhYigiQmxhY2sgUGF0aG9nZW4gRGFtYWdlIikKCmI8LWdncGxvdChkYXQyW2RhdDIkV2hpdGVGdW5nRGFtPDMwLF0pKwogIGdlb21fcG9pbnQoYWVzKHk9R01fVG90YWxMZWFmX0FyZWEseD1XaGl0ZUZ1bmdEYW0pLGNvbG91cj0iIzk5OTk5OSIpK3RoZW1lX3NpbXBsZV9tdWx0aUNvbCgpKwogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICIjOTk5OTk5Iiwgc2l6ZSA9IDE2LCBmYWNlID0gImJvbGQiLG1hcmdpbj1tYXJnaW4oMywwLDMsMCkpLAogICAgICApK3hsYWIoIlBvd2RlcnkgTWlsZGV3IERhbWFnZSIpCgpjPC1nZ3Bsb3QoZGF0MikrCiAgZ2VvbV9wb2ludChhZXMoeT1HTV9Ub3RhbExlYWZfQXJlYSx4PVRocmlwc0RhbSksY29sb3VyPSIjRTY5RjAwIikrdGhlbWVfc2ltcGxlX211bHRpQ29sKCkreGxhYigiVGhyaXBzIERhbWFnZSIpKwogICAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gIiNFNjlGMDAiLCBzaXplID0gMTYsIGZhY2UgPSAiYm9sZCIsbWFyZ2luPW1hcmdpbigzLDAsMywwKSkpCgpkPC1nZ3Bsb3QoZGF0MikrCiAgZ2VvbV9wb2ludChhZXMoeT1HTV9Ub3RhbExlYWZfQXJlYSx4PUZlcm4pLGNvbG91cj0iIzAwOUU3MyIpK3RoZW1lX3NpbXBsZV9tdWx0aUNvbCgpK3hsYWIoIkZlcm4gQWJ1bmRhbmNlIikrCiAgIGdlb21fYWJsaW5lKGludGVyY2VwdD04MDAzLjQ0LHNsb3BlID0gLTE3OS40NyxzaXplPTEuNSxjb2xvcj0iIzAwOUU3MyIpKwogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICIjMDA5RTczIiwgc2l6ZSA9IDE2LCBmYWNlID0gImJvbGQiLG1hcmdpbj1tYXJnaW4oMywwLDMsMCkpKQogICAKCgpwbG90PC1wbG90X2dyaWQoYSwgYixuY29sPTIscmVsX3dpZHRocyA9IGMoMSwxKSkKCnBsb3QyPC1wbG90X2dyaWQoZCwgYyxuY29sPTIscmVsX3dpZHRocyA9IGMoMSwxKSkKCnBsb3QzPC1wbG90X2dyaWQoYSxiLGMsZCxuY29sPTIscmVsX3dpZHRocyA9IGMoMSwxKSkKCnBsb3Q0PC1wbG90X2dyaWQoYSxiLGMsbmNvbD0xLHJlbF93aWR0aHMgPSBjKDEsMSwxKSkKcGxvdDU8LXBsb3RfZ3JpZChhLGIsYyxuY29sPTMscmVsX3dpZHRocyA9IGMoMSwxLDEpKQoKCnkuZ3JvYjwtdGV4dEdyb2IoYnF1b3RlKGJvbGQoIlNob290IEFyZWEgIihtbV4yKSkpLGdwPWdwYXIoZm9udGZhY2U9ImJvbGQiLGZvbnRzaXplPTIwKSxyb3Q9OTApCgoKI3RpZmYoIlNlbGVjdGlvbl9GaWd1cmVzL1BhdGhvZ2VuRWZmZWN0LnRpZmYiLCB1bml0cz0iaW4iLCB3aWR0aD0xNCwgaGVpZ2h0PTYsIHJlcz0zMDApCmdyaWQuYXJyYW5nZShwbG90LGxlZnQ9eS5ncm9iKQojZGV2Lm9mZigpCgojdGlmZigiU2VsZWN0aW9uX0ZpZ3VyZXMvUGF0aG9nZW5FZmZlY3QyLnRpZmYiLCB1bml0cz0iaW4iLCB3aWR0aD0xNCwgaGVpZ2h0PTYsIHJlcz0zMDApCmdyaWQuYXJyYW5nZShwbG90MixsZWZ0PXkuZ3JvYikKI2Rldi5vZmYoKQoKI3RpZmYoIlNlbGVjdGlvbl9GaWd1cmVzL1BhdGhvZ2VuRWZmZWN0My50aWZmIiwgdW5pdHM9ImluIiwgd2lkdGg9MTQsIGhlaWdodD0xMCwgcmVzPTMwMCkKZ3JpZC5hcnJhbmdlKHBsb3QzLGxlZnQ9eS5ncm9iKQojZGV2Lm9mZgoKZ3JpZC5hcnJhbmdlKHBsb3Q0LGxlZnQ9eS5ncm9iKQoKCiN0aWZmKCJTZWxlY3Rpb25fRmlndXJlcy9QYXRob2dlbkVmZmVjdDUudGlmZiIsIHVuaXRzPSJpbiIsIHdpZHRoPTE2LCBoZWlnaHQ9NSwgcmVzPTMwMCkKZ3JpZC5hcnJhbmdlKHBsb3Q1LGxlZnQ9eS5ncm9iKQojZGV2Lm9mZgoKI3RpZmYoIlNlbGVjdGlvbl9GaWd1cmVzL0Zlcm5FZmZlY3QudGlmZiIsIHVuaXRzPSJpbiIsIHdpZHRoPTgsIGhlaWdodD02LCByZXM9MzAwKQpncmlkLmFycmFuZ2UoZCxsZWZ0PXkuZ3JvYikKI2Rldi5vZmYKCmBgYAoKCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KI1BhcnQgMgoKCgoKI0luZmx1ZW5jZSBvZiBnbHVjIGFuZCBmbGF2IG9uIGRlZmVuY2UuIApgYGB7cn0KCmhpc3QoZGF0JEZlcm4pCmhpc3QoZGF0JFRocmlwc0RhbSkKaGlzdChkYXQkV2hpdGVGdW5nRGFtKQpoaXN0KGRhdCRCbGFja1BhdGhEYW0pCgojVGhpcyBkYXRhIGlzIHZlcnkgemVybyBpbmZsYXRlZCBhbmQgYSBwb2lzc29uIG1vZGVsIHdpbGwgYmUgdG9vIG92ZXJkaXNwZXJzZWQuIEkgYW0gYWZyYWlkIHRoYXQgYSBuZWdhdGl2ZSBiaW5vbWlhbCB3aWxsIGJlIGFzIHdlbGwuIApgYGAKCgojU2lnbmlmaWNhbnQgdGVzdGluZyAKCgoKI1doaXRlUGF0aERhbSAtLSBsb2dpc3RpYyByZWdyZXNzaW9uCmBgYHtyfQojQmVjYXVzZSBvZiBob3cgemVybyBpbmZsYXRlZCB3aGl0ZSBwYXRob2dlbiBkYW1hZ2UgaXMsIGkgd2lsbCB1c2UgYSBsb2dpc3RpYyByZWdyZXNzaW9uIHRvIG1vZGVsIGl0LgpkYXQyJFdoaXRlRnVuZ0xvZ2lzPC1OQQpkYXQyJFdoaXRlRnVuZ0xvZ2lzW2RhdDIkV2hpdGVGdW5nRGFtPT0wXTwtMApkYXQyJFdoaXRlRnVuZ0xvZ2lzW2RhdDIkV2hpdGVGdW5nRGFtPjBdPC0xCgoKI1RoaXMgaXMgdGhlIGJpZ2dlc3QgbW9kZWwgdGhhdCBjb3VsZCBjb252ZXJnZS4gLi4uIGludGVyYWN0aW9uIHdpdGggZmxhdm9ub2lkIGNvdWxkIG5vdC4KZml0X2Z1bGxfZzwtZ2xtZXIoV2hpdGVGdW5nTG9naXN+dHJlYXRtZW50KmdsdWNfQ29uYytmbGF2X0NvbmMrKDF8RmFtaWx5KSxmYW1pbHk9Ymlub21pYWwsZGF0YT1kYXQyWyFpcy5uYShkYXQyJGZsYXZfQ29uYyksXSkKCmZpdC4xPC11cGRhdGUoZml0X2Z1bGxfZyx+Li1mbGF2X0NvbmMpCmFub3ZhKGZpdF9mdWxsX2csZml0LjEpICNGbGF2b25vaWQgQ29uY2VudHJhdGlvbiBpcyBub3Qgc2lnbmlmaWNhbnQuIAoKCiNUZXN0aW5nIGdsdWNvc2lub2xhdGUgdHJlYXRtZW50IGludGVyYWN0aW9uLiAKZml0LjI8LWdsbWVyKFdoaXRlRnVuZ0xvZ2lzfnRyZWF0bWVudCpnbHVjX0NvbmMrKDF8RmFtaWx5KSxmYW1pbHk9Ymlub21pYWwsZGF0YT1kYXQyKQpmaXQuMzwtZ2xtZXIoV2hpdGVGdW5nTG9naXN+dHJlYXRtZW50K2dsdWNfQ29uYysoMXxGYW1pbHkpLGZhbWlseT1iaW5vbWlhbCxkYXRhPWRhdDIpCmFub3ZhKGZpdC4yLGZpdC4zKSAjR2x1Y29zaW5vbGF0ZTpUcmVhdG1lbnQgaW50ZXJhY3Rpb24gaXMgbm90IHNpZ25pZmljYW50LgoKI1Rlc3RpbmcgZ2x1Y29zaW5vbGF0ZSBpbnZvbHZtZW50IGF0IGFsbC4KZml0LjQ8LWdsbWVyKFdoaXRlRnVuZ0xvZ2lzfnRyZWF0bWVudCsoMXxGYW1pbHkpLGZhbWlseT1iaW5vbWlhbCxkYXRhPWRhdDJbIWlzLm5hKGRhdDIkZ2x1Y19Db25jKSxdKQpmaXQuMzwtZ2xtZXIoV2hpdGVGdW5nTG9naXN+dHJlYXRtZW50K2dsdWNfQ29uYysoMXxGYW1pbHkpLGZhbWlseT1iaW5vbWlhbCxkYXRhPWRhdDJbIWlzLm5hKGRhdDIkZ2x1Y19Db25jKSxdKQphbm92YShmaXQuNCxmaXQuMykgI0dsdWNvc2lub2xhdGUgQ29uY2VudHJhdGlvbiBpcyBub3QgYSBzaWduaWZpY2FudCBwcmVkaWN0b3IKCiNUZXN0aW5nIGVmZmVjdCBvZiB0cmVhdG1lbnQKZml0LjQ8LWdsbWVyKFdoaXRlRnVuZ0xvZ2lzfnRyZWF0bWVudCsoMXxGYW1pbHkpLGZhbWlseT1iaW5vbWlhbCxkYXRhPWRhdDIpCmZpdC41PC1nbG1lcihXaGl0ZUZ1bmdMb2dpc34xKygxfEZhbWlseSksZmFtaWx5PWJpbm9taWFsLGRhdGE9ZGF0MikKYW5vdmEoZml0LjQsZml0LjUpCiN0cmVhdG1lbnQgaXMgc2lnbmlmaWNhbnQuLi4uLi4KCnN1bW1hcnkoZml0LjQpICNHYXJsaWMgbXVzdGFyZCBpbiB0aGUgbWFwbGUgdHJlYXRtZW50IGhhdmUgbGVzcyBvY2N1cmVuY2Ugb2YgZnVuZ2FsIGNvbG9uaXphdGlvbi4gCgpwbG90KGZpdC40KQpgYGAKCiNWaXN1YWxpemluZyAtLSBlZmZlY3Qgb2YgdHJlYXRtZW50IG9uIHByb3BvcnRpb24gb2YgZnVuZ2FsIGFidW5kYW5jZS4gCmBgYHtyfQojU3VtbWFyaXppbmcgZm9yIERpc3BsYXk6IGdlbmVyYXRpbmcgZnJlcXVlbmN5IG9mIHdoaXRlIGZ1bmFsIGluZmVjdGlvbiBieSB0cmVhdG1lbnQKcGxvdDwtZGF0MiAlPiUgZHJvcF9uYShXaGl0ZUZ1bmdMb2dpcykgJT4lIGdyb3VwX2J5KHRyZWF0bWVudCkgJT4lIHN1bW1hcml6ZShQZXJjV2hpdEZ1bmc9c3VtKFdoaXRlRnVuZ0xvZ2lzKS9sZW5ndGgoV2hpdGVGdW5nTG9naXMpKjEwMCkKCgojdGlmZigiRGVmZW5jZV9GaWd1cmVzL1RyZWF0TWVhbldoaXRlRnVuZy50aWZmIiwgdW5pdHM9ImluIiwgd2lkdGg9OCwgaGVpZ2h0PTUsIHJlcz0zMDApCmdncGxvdChwbG90KSsKICBnZW9tX2NvbChhZXMoeD10cmVhdG1lbnQseT1QZXJjV2hpdEZ1bmcsZmlsbD10cmVhdG1lbnQpKSt0aGVtZV9zaW1wbGUoKSt5bGFiKCJGdW5nYWwgQWJ1bmRhbmNlXG4gKCUgSW5mZWN0ZWQpIikrCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLDMwLDUpKSsKc2NhbGVfeF9kaXNjcmV0ZShuYW1lPSIiLGxhYmVscz1jKCJBbG9uZSIsIkdhcmxpYyBNdXN0YXJkIiwiTWFwbGUiKSkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiMwMDlFNzMiLCIjNTZCNEU5IiwiI0U2OUYwMCIpLGxhYmVscz1jKCJBbG9uZSIsIkdhcmxpYyBNdXN0YXJkIiwiTWFwbGUiKSkrCiAgdGhlbWVfc2ltcGxlX211bHRpQ29sKCkrdGhlbWUoYXhpcy50aXRsZS55ID0gIGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNiwgZmFjZSA9ICJib2xkIixtYXJnaW49bWFyZ2luKDMsMjAsMywwKSkpCiNkZXYub2ZmKCkKCmBgYAoKI1Zpc3VhbGl6aW5nIC0tLSB0aGUgZGlzdHJpYnV0aW9uIG9mIHBhdGhvZ2VucyBieSB0cmVhdG1lbnQuIApgYGB7cn0KCnBsb3QyPC1kYXQyICU+JSBkcm9wX25hKEJsYWNrUGF0aERhbSkgJT4lIGdyb3VwX2J5KHRyZWF0bWVudCkgJT4lIHN1bW1hcml6ZShCbGFja1BhdGhBdmU9bWVhbihCbGFja1BhdGhEYW0sbmEucm09VCkpCgpwbG90MzwtZGF0MiAlPiUgZHJvcF9uYShUaHJpcHNEYW0pICU+JSBncm91cF9ieSh0cmVhdG1lbnQpICU+JSBzdW1tYXJpemUoVGhyaXBzRGFtPW1lYW4oVGhyaXBzRGFtLG5hLnJtPVQpKQoKcGxvdDQ8LWRhdDIgJT4lIGRyb3BfbmEoRmVybikgJT4lIGdyb3VwX2J5KHRyZWF0bWVudCkgJT4lIHN1bW1hcml6ZShGZXJuPW1lYW4oRmVybixuYS5ybT1UKSkKCgojQmxhY2sgUGF0aG9nZW4gYWJ1bmRhbmNlIGJ5IHRyZWFtdGVudApnZ3Bsb3QocGxvdDIpKwogIGdlb21fY29sKGFlcyh4PXRyZWF0bWVudCx5PUJsYWNrUGF0aEF2ZSxmaWxsPXRyZWF0bWVudCkpK3RoZW1lX3NpbXBsZSgpK3lsYWIoIkZ1bmdhbCBBYnVuZGFuY2VcbiAoJSBjb2xvbml6ZWQpIikreGxhYigiVHJlYXRtZW50IikrdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQoKI1RocmlwcyBhYnVuZGFuY2UgYnkgdHJlYXRtZW50LiAKZ2dwbG90KHBsb3QzKSsKICBnZW9tX2NvbChhZXMoeD10cmVhdG1lbnQseT1UaHJpcHNEYW0sZmlsbD10cmVhdG1lbnQpKSt0aGVtZV9zaW1wbGUoKSt5bGFiKCJGdW5nYWwgQWJ1bmRhbmNlXG4gKCUgY29sb25pemVkKSIpK3hsYWIoIlRyZWF0bWVudCIpK3RoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKCiNJIHdvdWxkIG5lZWQgdG8gYWNjb3VudCBmb3IgdGhlIGdhcmxpYyBtdXN0YXJkIGJlaW5nIHBzdWVkb3JlcGxpY2F0ZWQgaXd0aCB0aGUgZmVybiBkYXRhLCBiZWNhdXNlIGVhY2ggZ20gaW4gdGhlIGdtIHRyZWF0bWVudCB3YXMgZ3Jvd24gd2l0aCBhbm90aGVyIGdtIGluIHRoZSBzYW1lIHBvdC4gCmdncGxvdChwbG90NCkrCiAgZ2VvbV9jb2woYWVzKHg9dHJlYXRtZW50LHk9RmVybixmaWxsPXRyZWF0bWVudCkpK3RoZW1lX3NpbXBsZSgpK3lsYWIoIkF2ZXJhZ2UgRmVybiBBYnVuZGFuY2UgKCNGZXJucy9wb3QpIikreGxhYigiVHJlYXRtZW50IikrdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSsKICBzY2FsZV94X2Rpc2NyZXRlKG5hbWU9IiIsbGFiZWxzPWMoIkFsb25lIiwiR2FybGljIE11c3RhcmQiLCJNYXBsZSIpKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiIzAwOUU3MyIsIiM1NkI0RTkiLCIjRTY5RjAwIiksbGFiZWxzPWMoIkFsb25lIiwiR2FybGljIE11c3RhcmQiLCJNYXBsZSIpKSsKICB0aGVtZV9zaW1wbGVfbXVsdGlDb2woKSt0aGVtZShheGlzLnRpdGxlLnkgPSAgZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2LCBmYWNlID0gImJvbGQiLG1hcmdpbj1tYXJnaW4oMywyMCwzLDApKSkKI2Rldi5vZmYoKQoKCgpgYGAKCgojTW9kZWxsaW5nIC0tIHdoYXQgaW5mbHVlbmNlcyBXaGl0ZSBwYXRob2dlbiBkYW1hZ2U/CmBgYHtyfQojUm91bmRpbmcgdG8gaW50ZWdlcnMgZm9yIHdoaXRlIGZ1bmcgZGFtLiAKZGF0JFdoaXRlRnVuZ0RhbTwtY2VpbGluZyhkYXQkV2hpdGVGdW5nRGFtKQoKZml0X2Z1bGw8LWdsbWVyKFdoaXRlRnVuZ0RhbX50cmVhdG1lbnQqZ2x1Y19Db25jK3RyZWF0bWVudCpmbGF2X0NvbmMrKDF8RmFtaWx5L1RhZykrKDF8Z2hfYmVuY2gpLGZhbWlseT1wb2lzc29uLGRhdGE9ZGF0KQoKZml0LjE8LXVwZGF0ZShmaXRfZnVsbCx+Li1mbGF2X0NvbmM6dHJlYXRtZW50KQphbm92YShmaXQuMSxmaXRfZnVsbCkgI0ZpdDEgaXMgYSBiZXR0ZXIgbW9kZWwKCgpmaXQuMjwtdXBkYXRlKGZpdC4xLH4uLWdsdWNfQ29uYzp0cmVhdG1lbnQpCmFub3ZhKGZpdC4yLGZpdC4xKSAjbW9kZWxzIGFyZSB0aGUgc2FtZS4uLiBlbGltaW5hdGluZyBpbnRlcmFjdGlvbi4KCmZpdC4zPC11cGRhdGUoZml0LjIsfi4tZ2x1Y19Db25jKQphbm92YShmaXQuMyxmaXQuMikgI1RoZSBtb2RlbCBpbmNsdWRpbmcgZ2x1Y0NvbmMgaXMgYmV0dGVyLiAKCmZpdC4yPC11cGRhdGUoZml0LjIsZGF0YT1kYXRbIWlzLm5hKGRhdCRmbGF2X0NvbmMpLF0pICNVc2luZyBhIG1vZGVsIHdpdGggYSBkYXRhIHN1YnNldC4KZml0LjM8LXVwZGF0ZShmaXQuMix+Li1mbGF2X0NvbmMpIAphbm92YShmaXQuMyxmaXQuMikjZmxhdl9Db25jIGlzIHVuaW1wb3J0YW50LCBldmVuIHRob3VnaCB0aGUgQUlDIGFuZCBCSUMgYXJlIGxvd2VyLgoKI1RoZXJlZm9yZSwgdGhlIGJlc3QgbW9kZWwgaXM6CnN1bW1hcnkoZ2xtZXIoV2hpdGVGdW5nRGFtfnRyZWF0bWVudCtnbHVjX0NvbmMrKDF8RmFtaWx5L1RhZykrKDF8Z2hfYmVuY2gpLGZhbWlseT1wb2lzc29uLGRhdGE9ZGF0KSkKCiN0aGUgaW5jbHVzaW9uIG9mIEdIX0JlbmNoIGRvZXMgbm90IGFmZmVjdCB0aGUgb3V0Y29tZSBvZiB0aGUgbW9kZWwsIHRoZXJlb2ZyZSwgSSBhbSBleGNsdWRpbmcgaXQgYXMgdGhlIG90aGVyIG1vZGVsIHdhcyBzYXR1cmF0ZWQgYW5kIHRvb2sgYWxvdCB0aW1lIHRvIGNvbXB1dGUuIApzdW1tYXJ5KGdsbWVyKFdoaXRlRnVuZ0RhbX50cmVhdG1lbnQrZ2x1Y19Db25jKygxfEZhbWlseS9UYWcpLGZhbWlseT1wb2lzc29uLGRhdGE9ZGF0KSkKI1VzaW5nIGEgUGVybXV0YXRpb24gdGVzdCB0byBkZXRlcm1pbmUgdGhlIHByb2JhYmlsaXR5IG9mIGdldHRpbmcgYSBzaWduaWZpY2FudCBnbHVjb3Npbm9sYXRlIGNvbmNlbnRyYXRpb24gcHJlZGljdG9yLCBpZiB0aGUgZGF0YSBpcyByYW1kb21seSBzYW1wbGVkLiAKCmRhdFBlclRlc3Q8LWRhdApwU3RvcmU8LWMoKQpmb3IoaSBpbiAxOjEwMCl7CiAgI1JhbmRvbWl6ZSBnbHVjb3Npbm9sYXRlIGNvbmNlbnRyYXRpb24uCiAgZGF0UGVyVGVzdCRnbHVjX0NvbmM8LXNhbXBsZShkYXQkZ2x1Y19Db25jLGxlbmd0aChkYXQkZ2x1Y19Db25jKSxyZXBsYWNlID0gRikKICAKICAjUnVuIE1vZGVsIHdpdGggcmFuZG9taXplZCBnbHVjQ29uYyBhbmQgZXh0cmFjdCBwLXZhbHVlCiAgZ2x1Y1B2YWw8LXN1bW1hcnkoZ2xtZXIoV2hpdGVGdW5nRGFtfnRyZWF0bWVudCtnbHVjX0NvbmMrKDF8RmFtaWx5L1RhZyksZmFtaWx5PXBvaXNzb24sZGF0YT1kYXRQZXJUZXN0KSkkY29lZlszLDRdCiAgCiAgI1N0b3JlIFAgdmFsdWUuCiAgcFN0b3JlW2ldPC1nbHVjUHZhbAp9CgpzdW0ocFN0b3JlPDAuMDUpL2xlbmd0aChwU3RvcmUpCgoKI0dpdmVuIHRoYXQgNjQlIG9mIHRoZSBtb2RlbHMgcmV0dXJuIGEgc2lnbmlmaWNhbnQgcCB2YWx1ZSwgSSB3b3VsZCBzYXkgdGhhdCB0aGlzIGlzIGEgdmVyeSB2ZXJ5IHZlcnkgYmFkIG1vZGVsLiAKYGBgCgoKCgojVmlzdWFsbGl6aW5nIC0tIHdoaXRlIGZ1bmdhbCBkYW1hZ2UgaXMgaW5mbHVlbmNlZCBieSBnbHVjIGFuZCB0cmVhdG1uZXQuIApgYGB7cn0KClBvaXNTbG9wZT1mdW5jdGlvbih4LGludCl7CiAgeT1leHAoLTIuMzIyOTIqeCtpbnQpCiAgcmV0dXJuKHkpCn0KCmdsdWNwbG90PXNlcShtaW4oZGF0JGdsdWNfQ29uYyksbWF4KGRhdCRnbHVjX0NvbmMpLGxlbmd0aC5vdXQgPSA2OTUpCgpGdW5nQTwtUG9pc1Nsb3BlKGdsdWNwbG90LC0wLjE1NzAxKQpGdW5nTTwtUG9pc1Nsb3BlKGdsdWNwbG90LC0wLjE1NzAxLTAuODIwNjApCkZ1bmdHTTwtUG9pc1Nsb3BlKGdsdWNwbG90LC0wLjE1NzAxKzAuMDI0ODMpCgpmaXQuZzwtZ2xtKFdoaXRlRnVuZ0RhbX5nbHVjX0NvbmMrdHJlYXRtZW50LGZhbWlseT1wb2lzc29uLGRhdGE9ZGF0KQpzdW1tYXJ5KGZpdC5nKQoKcHJlZGljdChmaXQuZyx0eXBlPSJyZXNwb25zZSIsbmV3ZGF0YT1kYXRhLmZyYW1lKCJ0cmVhdG1lbnQiPXJlcCgiYSIsNjk1KSwiZ2x1Y19Db25jIj1nbHVjcGxvdCkpCgpkYXR2PC1kYXRbIWlzLm5hKGRhdCRXaGl0ZUZ1bmdEYW0pLF0KCiN0aWZmKCJEZWZlbmNlX0ZpZ3VyZXMvR2x1Y29zaW5vbGF0ZUZ1bmdpLnRpZmYiLCB1bml0cz0iaW4iLCB3aWR0aD0xMCwgaGVpZ2h0PTYsIHJlcz0zMDApCmdncGxvdChkYXR2W2RhdHYkV2hpdGVGdW5nRGFtPDMwLF0pKwogIGdlb21fcG9pbnQoYWVzKHk9V2hpdGVGdW5nRGFtLHg9Z2x1Y19Db25jLGNvbG91cj10cmVhdG1lbnQpKSsKICAgIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWMoIiMwMDlFNzMiLCIjNTZCNEU5IiwiI0U2OUYwMCIsIiMwMDlFNzMiLCIjNTZCNEU5IiwiI0U2OUYwMCIpLGxhYmVscz1jKCJBbG9uZSIsIkdhcmxpYyBNdXN0YXJkIiwiTWFwbGUiKSkrdGhlbWVfc2ltcGxlKCkrCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcz1jKDAsMiw0LDYsOCwxMCwxMikpKwogIGdlb21fcGF0aCh4PWdsdWNwbG90LHk9RnVuZ0EsY29sb3VyPSIjMDA5RTczIikrCiAgZ2VvbV9wYXRoKHg9Z2x1Y3Bsb3QseT1GdW5nTSxjb2xvdXI9IiNFNjlGMDAiKSsKICB5bGFiKCJQb3dkZXJ5IE1pbGRldyBEYW1hZ2UiKSsKeGxhYihicXVvdGUoYm9sZCgiW1RvdGFsIEdsdWNvc2lub2xhdGVdICIgKG1nL21sKSkpKQojZGV2Lm9mZigpCgpgYGAKCgojTW9kZWxsaW5nIC0tIFdoYXQgaW5mbHVlbmNlcyBCbGFjayBQYXRob2dlbiBEYW1hZ2U/CmBgYHtyfQpkYXQkQmxhY2tQYXRoRGFtCmRhdCRCbGFja1BhdGhEYW08LWNlaWxpbmcoZGF0JEJsYWNrUGF0aERhbSkKI0dsdWNvc2lub2xhdGUgYW5kIGZsYXZvbm9pZHMgYXJlIGNvcnJlbGF0ZWQsIGJ1dCB0aGUgUjIgaXMgb25seSAwLjM5LCBzbyBpIGRvbnQgdGhpbmsgaXQgaXMgYSB2ZXJ5IGJpZyBkZWFsLiAKc3VtbWFyeShsbShnbHVjX0NvbmN+Zmxhdl9Db25jLGRhdD1kYXQpKQoKZml0X2Z1bGw8LWdsbWVyKEJsYWNrUGF0aERhbX50cmVhdG1lbnQqZ2x1Y19Db25jK3RyZWF0bWVudCpmbGF2X0NvbmMrKDF8RmFtaWx5L1RhZykrKDF8Z2hfYmVuY2gpLGZhbWlseT1wb2lzc29uLGRhdGE9ZGF0KQoKZml0LjE8LXVwZGF0ZShmaXRfZnVsbCx+Li1mbGF2X0NvbmM6dHJlYXRtZW50KQphbm92YShmaXQuMSxmaXRfZnVsbCkgI0ZpdDEgaXMgYSBiZXR0ZXIgbW9kZWwKCgpmaXQuMjwtdXBkYXRlKGZpdC4xLH4uLWdsdWNfQ29uYzp0cmVhdG1lbnQpCmFub3ZhKGZpdC4yLGZpdC4xKSAjRml0MiBpcyB0ZWNobmljYWxseSBiZXR0ZXIsIGJ1dCB0aGUgbW9kZWwgc3RpbCBmYWlsZWQgdG8gY29udmVyZ2UsIHNvIHRoZSBlc3RpbWF0ZSBtYXkgbm90IGJlIHJlbGlhYmxlLiBFc3BlY2lhbGx5IHNpbmNlIG5vbiBvZiB0aGUgZ2x1YyBjb25jIHRlcm1zIGFyZSBzaWduaWZpY2FudC4gSXQgd2lsbCBiZSByZW1vdmVkLiAKc3VtbWFyeShmaXQuMikKCgpmaXQuMzwtdXBkYXRlKGZpdC4yLH4uLWdsdWNfQ29uYykKYW5vdmEoZml0LjMsZml0LjIpICNUaGVyZSBpcyBubyBkaWZmZXJlbmNlIGluIGEgbW9kZWwgd2l0aCBhbmQgd2l0aG91dCBnbHVjX0NvbmMuIFRoZXJlZm9yZSwgaXQgaXMgcmVtb3ZlZC4gCgpmaXQuMzwtdXBkYXRlKGZpdC4zLGRhdGE9ZGF0WyFpcy5uYShkYXQkZmxhdl9Db25jKSxdKSAjVXNpbmcgYSBtb2RlbCB3aXRoIGEgZGF0YSBzdWJzZXQuCmZpdC40PC11cGRhdGUoZml0LjMsfi4tZmxhdl9Db25jKSAKYW5vdmEoZml0LjQsZml0LjMpI2ZsYXZfQ29uYyBpcyB2ZXJ5IHNpZ25pZmljYW50LktlZXBpbmcgdGhpcyBpbiB0aGUgbW9kZWwuCgpmaXQuNDwtdXBkYXRlKGZpdC4zLH4uLXRyZWF0bWVudCkKCmFub3ZhKGZpdC40LGZpdC4zKQojdHJlYXRtZW50IGlzIG5vdCBpbXBvcnRhbnQuIAoKI1RoZXJlZm9yZSwgdGhlIGJlc3QgbW9kZWwgdG8gYWNjb3VudCBmb3IgYmxhY2sgcGF0aG9nZW4gZGFtYWdlIGlzIHNpbXBseSBmbGF2b25vaWRzLiAKCmZpdC40PC1nbG1lcihCbGFja1BhdGhEYW1+Zmxhdl9Db25jKygxfEZhbWlseS9UYWcpKygxfGdoX2JlbmNoKSxmYW1pbHk9cG9pc3NvbixkYXRhPWRhdCkKCgpnZ3Bsb3QoZGF0KSsKICBnZW9tX3BvaW50KGFlcyh5PUJsYWNrUGF0aERhbSx4PWZsYXZfQ29uYykpCgpzdW1tYXJ5KGZpdC40KSAjRmxhdiBjb25jIGlzIGFjdHVhbGx5IGEgdmVyeSBzaWduaWZpY2FudCBwcmVkaWN0b3IuIAoKCiNQZXJtdXRhdGlvbiB0ZXN0LiAKCmRhdFBlclRlc3Q8LWRhdApwU3RvcmU8LWMoKQpmb3IoaSBpbiAxOjEwMCl7CiAgI1JhbmRvbWl6ZSBnbHVjb3Npbm9sYXRlIGNvbmNlbnRyYXRpb24uCiAgZGF0UGVyVGVzdCRmbGF2X0NvbmM8LXNhbXBsZShkYXQkZmxhdl9Db25jLGxlbmd0aChkYXQkZmxhdl9Db25jKSxyZXBsYWNlID0gRikKICAKICAjUnVuIE1vZGVsIHdpdGggcmFuZG9taXplZCBnbHVjQ29uYyBhbmQgZXh0cmFjdCBwLXZhbHVlCiAgZmxhdlB2YWw8LXN1bW1hcnkoZ2xtZXIoQmxhY2tQYXRoRGFtfmZsYXZfQ29uYysoMXxGYW1pbHkvVGFnKSxmYW1pbHk9cG9pc3NvbixkYXRhPWRhdFBlclRlc3QpKSRjb2VmWzIsNF0KICAKICAjU3RvcmUgUCB2YWx1ZS4KICBwU3RvcmVbaV08LWZsYXZQdmFsCn0KCnN1bShwU3RvcmU8MC4wNSkvbGVuZ3RoKHBTdG9yZSkKCiNBcHByb3hpbWl0ZWx5IGhhbGYgb2YgdGhlIHAgdmFsdWVzIGFyZSBsZXNzIHRoYW4gMC4wNSwgdGhpcyBzdWdnZXN0cyB0aGF0IHRoaXMgbW9kZWwgaXMgcXVpdGUgaG9ycmlibGUuIAoKYGBgCgojVmlzdWFsbGl6aW5nIC0tIEJsYWNrIFBhdGhvZ2VuIGRhbWFnZSBpcyBpbmZsdWVuY2VkIGJ5IGZsYXZvbm9scy4gCmBgYHtyfQoKClBvaXNTbG9wZT1mdW5jdGlvbih4KXsKICB5PWV4cCgtMS4xMTUwKngrMS42ODE2KQogIHJldHVybih5KQp9CgoKZmxhdnBsb3Q9c2VxKG1pbihkYXQkZmxhdl9Db25jLG5hLnJtID0gVCksbWF4KGRhdCRmbGF2X0NvbmMsbmEucm09VCksbGVuZ3RoLm91dCA9IDY4NykKCmZsYXZ5PC1Qb2lzU2xvcGUoZmxhdnBsb3QpCgojdGlmZigiRGVmZW5jZV9GaWd1cmVzL0ZsYXZvbm9pZEJsYWNrUGF0aC50aWZmIiwgdW5pdHM9ImluIiwgd2lkdGg9MTAsIGhlaWdodD02LCByZXM9MzAwKQpnZ3Bsb3QoZGF0WyFpcy5uYShkYXQkZmxhdl9Db25jKSYhaXMubmEoZGF0JGZsYXZfQ29uYyksXSkrCiAgZ2VvbV9wb2ludChhZXMoeT1CbGFja1BhdGhEYW0seD1mbGF2X0NvbmMpKSt0aGVtZV9zaW1wbGUoKSsKICBnZW9tX3BhdGgoeD1mbGF2cGxvdCx5PWZsYXZ5LHNpemU9MSxjb2xvdXI9IiM5OTk5OTkiKSsKICAKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzPWMoMCw1LDEwLDE1LDIwLDI1LDMwKSkrCiAgeWxhYigiQmxhY2sgUGF0aG9nZW4gRGFtYWdlIikrCnhsYWIoYnF1b3RlKGJvbGQoIltUb3RhbCBGbGF2b25vaWRdICIgKG1nL21sKSkpKQojZGV2Lm9mZigpCgpgYGAKCgojV2hhdCBpbmZsdWVuY2VzIFRocmlwcyBkYW1hZ2U/CmBgYHtyfQojR2x1Y29zaW5vbGF0ZSBhbmQgZmxhdm9ub2lkcyBhcmUgY29ycmVsYXRlZCwgYnV0IHRoZSBSMiBpcyBvbmx5IDAuMzksIHNvIGkgZG9udCB0aGluayBpdCBpcyBhIHZlcnkgYmlnIGRlYWwuIApzdW1tYXJ5KGxtKGdsdWNfQ29uY35mbGF2X0NvbmMsZGF0PWRhdCkpCgpmaXRfZnVsbDwtZ2xtZXIoVGhyaXBzRGFtfnRyZWF0bWVudCtnbHVjX0NvbmMrZmxhdl9Db25jKygxfEZhbWlseS9UYWcpKygxfGdoX2JlbmNoKSxmYW1pbHk9cG9pc3NvbixkYXRhPWRhdCkKCmZpdC4xPC11cGRhdGUoZml0X2Z1bGwsfi4tZ2x1Y19Db25jKQphbm92YShmaXQuMSxmaXRfZnVsbCkgI0dsdWMgQ29uYyBpcyBpbiBubyB3YXkgYSBzaWduaWZpY2FudCBwcmVkaWN0b3IuIAoKCmZpdC4yPC11cGRhdGUoZml0LjEsfi4tdHJlYXRtZW50KQphbm92YShmaXQuMSxmaXQuMikgI3RyZWF0bWVudCBpcyBub3QgYSBzaWduaWZpY2FudCBwcmVkaWN0b3IuIAoKCmZpdC4yPC11cGRhdGUoZml0LjIsZGF0YT1kYXRbIWlzLm5hKGRhdCRmbGF2X0NvbmMpLF0pI0NoYW5naW5nIGRhdGEgc2V0IHRvIGFjY291bnQgZm9yIG1pc3NpbmcgZmxhdm9ub2lkIGRhdGEuIApmaXQuMzwtdXBkYXRlKGZpdC4yLH4uLWZsYXZfQ29uYykKYW5vdmEoZml0LjMsZml0LjIpICNUaGVyZSBpcyBubyBkaWZmZXJlbmNlIGluIGEgbW9kZWwgd2l0aCBhbmQgd2l0aG91dCBnbHVjX0NvbmMuIFRoZXJlZm9yZSwgaXQgaXMgcmVtb3ZlZC4gCgpmaXQuMzwtdXBkYXRlKGZpdC4zLGRhdGE9ZGF0WyFpcy5uYShkYXQkZmxhdl9Db25jKSxdKSAjVXNpbmcgYSBtb2RlbCB3aXRoIGEgZGF0YSBzdWJzZXQuCmZpdC40PC11cGRhdGUoZml0LjMsfi4tZmxhdl9Db25jKSAKYW5vdmEoZml0LjQsZml0LjMpI2ZsYXZfQ29uYyBpcyB2ZXJ5IHNpZ25pZmljYW50LktlZXBpbmcgdGhpcyBpbiB0aGUgbW9kZWwuCgoKZ2dwbG90KGRhdCkrCiAgZ2VvbV9wb2ludChhZXMoeT1UaHJpcHNEYW0seD1mbGF2X0NvbmMpKQoKZml0LjQ8LWdsbWVyKFRocmlwc0RhbX5mbGF2X0NvbmMrKDF8RmFtaWx5L1RhZykrKDF8Z2hfYmVuY2gpLGZhbWlseT1wb2lzc29uLGRhdGE9ZGF0KQoKc3VtbWFyeShmaXQuNCkgI0ZsYXYgY29uYyBpcyBhZ2FpbiwgYSB2ZXJ5IHNpZ25pZmljYW50IHByZWRpY3Rvci4gCgoKCiNQZXJtdXRhdGlvbiB0ZXN0LiAKZGF0JFRocmlwc0RhbTwtY2VpbGluZyhkYXQkVGhyaXBzRGFtKQpkYXRQZXJUZXN0PC1kYXQKcFN0b3JlPC1jKCkKZm9yKGkgaW4gMToxMDApewogICNSYW5kb21pemUgZ2x1Y29zaW5vbGF0ZSBjb25jZW50cmF0aW9uLgogIGRhdFBlclRlc3QkZmxhdl9Db25jPC1zYW1wbGUoZGF0JGZsYXZfQ29uYyxsZW5ndGgoZGF0JGZsYXZfQ29uYykscmVwbGFjZSA9IEYpCiAgCiAgI1J1biBNb2RlbCB3aXRoIHJhbmRvbWl6ZWQgZ2x1Y0NvbmMgYW5kIGV4dHJhY3QgcC12YWx1ZQogIGZsYXZQdmFsPC1zdW1tYXJ5KGdsbWVyKFRocmlwc0RhbX5mbGF2X0NvbmMrKDF8RmFtaWx5L1RhZyksZmFtaWx5PXBvaXNzb24sZGF0YT1kYXRQZXJUZXN0KSkkY29lZlsyLDRdCiAgCiAgI1N0b3JlIFAgdmFsdWUuCiAgcFN0b3JlW2ldPC1mbGF2UHZhbAp9CgpzdW0ocFN0b3JlPDAuMDUpL2xlbmd0aChwU3RvcmUpCgojQWJvdXQgaGFsZiBvZiB0aG9zZSB3aXRoIHRocmlwcyBkYW0gaXMgYWxzbyBzaWduaWZpY2FudC4gSSBuZWVkIGVpdGhlciBhIGRpZmZlcmVudCBtb2RlbCwgb3IgdG8gdXNlIGEgbG9naXN0aWMgcmVncmVzc2lvbi4gCgpgYGAKCiNWaXN1YWxpemluZyAtIGluZmx1ZW5jZSBvZiBmbGF2b25vaWRzIG9uIHRocmlwcyBkYW1hZ2UuIApgYGB7cn0KClBvaXNTbG9wZT1mdW5jdGlvbih4KXsKICB5PWV4cCgtMi4zMzE5KngrMy41MjQ5KQogIHJldHVybih5KQp9CgoKZmxhdnBsb3Q9c2VxKG1pbihkYXQkZmxhdl9Db25jLG5hLnJtID0gVCksbWF4KGRhdCRmbGF2X0NvbmMsbmEucm09VCksbGVuZ3RoLm91dCA9IDY4NykKCmZsYXZ5PC1Qb2lzU2xvcGUoZmxhdnBsb3QpCgojdGlmZigiRGVmZW5jZV9GaWd1cmVzL0ZsYXZvbm9pZFRocmlwcy50aWZmIiwgdW5pdHM9ImluIiwgd2lkdGg9MTAsIGhlaWdodD02LCByZXM9MzAwKQpnZ3Bsb3QoZGF0WyFpcy5uYShkYXQkZmxhdl9Db25jKSYhaXMubmEoZGF0JGZsYXZfQ29uYyksXSkrCiAgZ2VvbV9wb2ludChhZXMoeT1UaHJpcHNEYW0seD1mbGF2X0NvbmMpKSt0aGVtZV9zaW1wbGUoKSsKICBnZW9tX3BhdGgoeD1mbGF2cGxvdCx5PWZsYXZ5LHNpemU9MSxjb2xvdXI9IiM5OTk5OTkiKSsKICAKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzPWMoMCw1LDEwLDE1LDIwLDI1LDMwLDM1LDQwKSkrCiAgeWxhYigiVGhyaXBzIERhbWFnZSIpKwp4bGFiKGJxdW90ZShib2xkKCJbVG90YWwgRmxhdm9ub2lkXSAiIChtZy9tbCkpKSkKI2Rldi5vZmYoKQoKYGBgCgoKCgojVmlzdWFsaXppbmcgLS0gZWZmZWN0IG9mIGZsYXZvbm9pZHMgb24gZmVybiBhYnVuZGFuY2UuIApgYGB7cn0KClBvaXNTbG9wZT1mdW5jdGlvbih4LGludCl7CiAgeT1leHAoKC0wLjAyMzUzIC0zLjEyNDc1KSp4K2ludCkKICByZXR1cm4oeSkKfQpleHAoLTAuNjU3MSkKCmZsYXZwbG90PXNlcShtaW4oZGF0JGZsYXZfQ29uYyxuYS5ybSA9IFQpLG1heChkYXQkZmxhdl9Db25jLG5hLnJtPVQpLGxlbmd0aC5vdXQgPSA3MDcpCgpmbGF2eUE8LVBvaXNTbG9wZShmbGF2cGxvdCwtMi4xNjgzKQpmbGF2eU08LVBvaXNTbG9wZShmbGF2cGxvdCwtMS42MDU0Ni0yLjgxNDUwKQpmbGF2eUdNPC1Qb2lzU2xvcGUoZmxhdnBsb3QsLTIuMTY4My0wLjI3ODYpCgoKI3RpZmYoIkRlZmVuY2VfRmlndXJlcy9GbGF2b25vaWRGZXJuLnRpZmYiLCB1bml0cz0iaW4iLCB3aWR0aD0xMCwgaGVpZ2h0PTYsIHJlcz0zMDApCmdncGxvdChkYXQpKwogIGdlb21fcG9pbnQoYWVzKHk9RmVybix4PWZsYXZfQ29uYyxjb2xvdXI9dHJlYXRtZW50KSkrdGhlbWVfc2ltcGxlKCkrCiAjIGdlb21fcGF0aCh4PWZsYXZwbG90LHk9ZmxhdnlBLHNpemU9MSxjb2xvdXI9IiMwMDlFNzMiKQogICNnZW9tX3BhdGgoeD1mbGF2cGxvdCx5PWZsYXZ5R00sc2l6ZT0xLGNvbG91cj0iIzU2QjRFOSIpCiAgZ2VvbV9wYXRoKHg9ZmxhdnBsb3QseT1mbGF2eU0sc2l6ZT0xLGNvbG91cj0iI0U2OUYwMCIpKwogICAgICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1jKCIjMDA5RTczIiwiIzU2QjRFOSIsIiNFNjlGMDAiKSxsYWJlbHM9YygiQWxvbmUiLCJHYXJsaWMgTXVzdGFyZCIsIk1hcGxlIikpKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3M9YygwLDUsMTAsMTUsMjAsMjUsMzAsMzUsNDApKSsKICB5bGFiKCJGZXJuIEFidW5kYW5jZSIpKwp4bGFiKGJxdW90ZShib2xkKCJbVG90YWwgRmxhdm9ub2lkXSAiIChtZy9tbCkpKSkKI2Rldi5vZmYoKQoKYGBgCgpIb3cgY2FuIHdlIGtub3cgdGhhdCBoZWFsdGh5IHBsYW50cyBkb250IGp1c3QgZXhoaWJpdCBtb3JlIHNlY29uZGFyeSBjb21wb3VuZHMgYW5kIG5vdCB0aGF0IHRob3NlIHdpdGggbW9yZSBzZWNvbmRhcnkgY29tcG91bmRzIGFyZSBoZWFsdGhpZXI/CgoKCgoK